这是我使用类别执行此操作的方法。
请注意,我有一个 CategoryRepository。您可以在 FormType 类和控制器中的 query_builder 选项中使用此存储库中的方法。
我的 findAllCategories() 方法返回一个查询构建器对象,因此我可以在存储库中有另一个方法,称为 countCategories(),它返回同一查询构建器对象的标量计数。
这使我可以访问控制器中的 count 方法,并确保计算与我用来查找类别的查询生成器一致。
这是一个非常简单的示例,但如果您有更复杂的带有连接和 where 子句的查找器方法,它会变得更加有用。
在我的控制器中:
<?php
use Site\FrontendBundle\Form\Type\CategoryType;
public function indexAction()
{
$em = $this->getDoctrine()->getManager();
$repo = $em->getRepository('SiteFrontendBundle:Category');
$form = $this->createForm(new CategoryType());
$count = $repo->countAllCategories();
return $this->render('SiteFrontendBundle:Category:count.html.twig', array(
'form' => $form->createView(),
'count' => $count
));
}
在我的表单类型中:
<?php
namespace Site\FrontendBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Site\FrontendBundle\Repository\CategoryRepository;
class CategoryType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('category', 'entity', array(
'class' => 'SiteFrontendBundle:Category',
'property' => 'title',
'query_builder' => function(CategoryRepository $cr) {
return $cr->findAllCategories();
}
))
;
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Site\FrontendBundle\Entity\Category'
));
}
public function getName()
{
return 'category_type';
}
}
在我的类别存储库中:
<?php
namespace Site\FrontendBundle\Repository;
use Doctrine\ORM\EntityRepository;
class CategoryRepository extends EntityRepository
{
public function findAllCategories()
{
return $this->createQueryBuilder('c')
->orderBy('c.lft', 'ASC')
;
}
public function countAllCategories()
{
return $this
->findAllCategories()
->select('COUNT(c.id)')
->getQuery()
->getSingleScalarResult()
;
}
}
如果您有任何问题,请告诉我。