Вот как я это делаю с помощью категорий.
Обратите внимание, что у меня есть CategoryRepository. Вы можете использовать методы из этого репозитория внутри параметров query_builder в классах FormType, а также в вашем контроллере.
Метод findAllCategories() возвращает объект построителя запросов, поэтому я могу иметь другой метод в репозитории, называемый countCategories(), который возвращает скалярное число того же объекта построителя запросов.
Это позволяет мне получить доступ к методу count в моем контроллере и убедиться, что couting будет соответствовать построителю запросов, который я использую, чтобы найти категории.
Это очень простой пример, но он становится более полезным, если у вас более сложные методы поиска с объединениями и предложениями.
В моем контроллере:
<?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';
}
}
и в моей категории Repository:
<?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()
;
}
}
Если у вас есть какие-либо вопросы, дайте мне знать.
Привет, Уильямс, спасибо за ваш ответ. Я нашел решение, напрямую доступное для ** этого параметра. '$ form-> get (" field_name ") -> getConfig() -> getOption ('choice_list') -> getChoices()', но это приводит к второму доступу к базе данных. Ваше решение также выполняет два запроса в базу данных, но только для подсчета количества доступных категорий. Я сохраню ваше решение, пока кто-то не предложит лучший способ сделать это. Я все еще думаю, что есть элегантный способ добиться этого. Спасибо –