Как я могу использовать queryBuilder с formBuilder в Symfony 4? - PullRequest
0 голосов
/ 15 марта 2019

У меня трудности с использованием построителя запросов в Symfony. Таким образом, в моем окне выбора перечислены все данные, которые хранятся в моей сущности "Параметры":

$options['class'] = Options::class;
$options['choice_label'] = function ($value) {
    return $value->getName();
};

$formBuilder->add($name, $class, $options);

Но я хочу отфильтровать данные, чтобы в параметрах отображались только те данные, которые связаны с определенным идентификатором моей сущности "Поля".

Это мой подход к построителю запросов:

$options['class'] = Options::class;
$options['choice_label'] = 'id';
$options['query_builder'] = function (EntityRepository $id) {
    return $this->createQueryBuilder('f')
        ->leftJoin('f.fields', 'fi')
        ->where(":id MEMBER OF f.fields")
        ->setParameter(':id', $id)
        ->getQuery()
        ->execute();
};

Я получаю сообщение об ошибке:

Аргумент 1 передан App \ Controller \ PagesController :: App \ Controller {closure} () должен быть Экземпляр App \ Controller \ EntityRepository, экземпляр App \ Repository \ OptionsRepository задано, вызывается в /Users/work/project/vendor/symfony/doctrine-bridge/Form/Type/EntityType.php по линии 32

1 Ответ

4 голосов
/ 15 марта 2019

Давайте начнем с того, что EntityRepository - это основной репозиторий Doctrine, который находится в Doctrine\ORM\EntityRepository; пространстве имен.Я также сомневаюсь , что у вас есть еще EntityRepository в вашем проекте.

Итак, первая ошибка в неправильной подсказке типа.Вы должны добавить use Doctrine\ORM\EntityRepository; перед вашим контроллером.OptionsRepository будет соответствовать этому определению, поскольку оно расширяет EntityRepository, или, по крайней мере, оно должно .

Вторая ошибка ->setParameter(':id', $id) - вы не можете установить хранилище как параметр запроса, он бесполезен.Я не знаю, что такое $id, но, как и с любыми другими функциями обратного вызова, вы можете use.

И в-третьих, как опция называется query_builder - ваш обратный вызов должен вернуть QueryBuilder, поэтому удалите ->getQuery()->execute();.

В конце правильный код должен быть:

use Doctrine\ORM\EntityRepository;

//....

$options['query_builder'] = function (EntityRepository $er) use ($id) {
    return $er->createQueryBuilder('f')
        ->leftJoin('f.fields', 'fi')
        ->where(":id MEMBER OF f.fields")
        ->setParameter(':id', $id);
};
...