以下是我如何使用類別做到這一點。
請注意,我有一個CategoryRepository。您可以使用FormType類中的query_builder選項內以及您的控制器中的此存儲庫中的方法。我的findAllCategories()方法返回一個查詢生成器對象,因此我可以在存儲庫中有另一個名爲countCategories()的方法,它返回同一查詢生成器對象的標量計數。
這使我可以訪問我的控制器中的count方法,並確保couting將與我用來查找類別的查詢構建器一致。
這是一個非常簡單的例子,但如果你有更復雜的查找方法和連接以及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()
;
}
}
如果您有任何問題,讓我知道。
嗨威廉姆斯,感謝您的回覆。我找到了一個直接訪問該字段的** choice_list **選項的解決方案。 ($) - > get(「field_name」) - > getConfig() - > getOption('choice_list') - > getChoices()',但這會導致第二次訪問數據庫。您的解決方案還向數據庫發出兩個請求,但僅用於計算可用的類別數量。我會一直跟着你的解決方案,直到有人建議更好的方法來做到這一點。我仍然認爲有一個很好的方法來實現這一點。謝謝 –