Symfony 4 Форма поиска по типу объекта (M: N), в результатах отображаются только поля из формы, остальные отсутствуют - PullRequest
1 голос
/ 24 января 2020

У меня есть 2 объекта: работник (идентификатор, имя) и профессия (идентификатор, название).

У меня есть несколько работников с одной или несколькими профессиями. Когда я открываю веб-сайт, я вижу рабочие данные по всем профессиям рабочих. Например:

ID: 2 - Том - учитель, водитель

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

ID: 2 - Tom - водитель (текст: профессия учителя исчезает из результатов)

Это должен быть ID: 2 - Tom - учитель, водитель (то же самое как и раньше, но в списке должны отображаться только лица, имеющие профессию водителя, но текст об остальной профессии должен быть здесь, чтобы прочитать)

Код из контроллера поиска:

$repository = $this->getDoctrine()->getRepository(Worker::class);
$form = $this->createForm(WorkerSearchType::class, null, [
    'method' => 'GET',
]);

$form->handleRequest($request);

if ($form->isSubmitted() && $form->isValid()) {
    $professions = $form->get('professions')->getData();

    $qb = $repository->createQueryBuilder('w')
        ->select('w, p')
        ->leftJoin('w.professions', 'p');

    if(isset($professions) && count($professions)>0){
        $qb->andWhere('p.id IN (:professions)')
            ->setParameter('professions', $professions);
    }

    $qb = $qb->getQuery();
}

if(!isset($qb)){
    $qb = $repository->createQueryBuilder('w')
        ->select('w')
        ->orderBy("w.created", 'DESC')
        ->getQuery();
}

Фрагмент типа формы:

$builder
            ->add('professions', EntityType::class, array(
                'class' => Profession::class,
                'query_builder' => function (EntityRepository $er) {
                    return $er->createQueryBuilder('u')
                        ->orderBy('u.name', 'ASC');
                },
                'choice_label' => 'name',
                'multiple' => true,
                'expanded' => false,
                'required' => false,
                'label' => false,
            ))
;
...