Задать вопрос

Как правильно получить связанные записи одним запросом в symfony?

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

public function nextAction()
    {
        $doctrine = $this->getDoctrine()->getManager();
        $questions = $doctrine->getRepository(EyForm::class)->findAll();

        $formTypePath = 'AppBundle\\Form\\Type\\';
        $builder = $this->createFormBuilder();
        foreach ($questions as $question){
            $label = $question->getRu();
            $fieldName = $question->getFieldName();
            $fieldType = $question->getFieldType()->getType();
            $builder->add($fieldName, $formTypePath . $fieldType, array('label' => $label));
        }
        $form = $builder->getForm();
        .....
}


Это работает, но если я правильно понимаю, в цикле каждый раз идет запрос к базе на получение типа поля,
а можно выбрать все одним запросом, что-то вроде этого:

// AppBundle/Entity/EyForm.php;

public function findAll()
    {
        $query = $this->getEntityManager()
            ->createQuery(
                'SELECT * 
                 FROM ey_form f
                 JOIN ey_form_type t ON f.field_type = t.id_form_type
                 ORDER BY f.id_form');

        try {
            return $query->getSingleResult();
        } catch (\Doctrine\ORM\NoResultException $e) {
            return null;
        }
    }


Это, соответственно, работать не хочет (просто не видит метод).
В документации показано, как получить одну связанную запись, добавив метод в сущность:
public function findOneByIdJoinedToCategory($productId)
https://symfony.com/doc/current/doctrine/associati...

Но если метод не начинается со слов findBy или findOneBy, то выскакивает ошибка, говорящая об этом.

Как правильно получить связанные записи одним запросом в symfony?

**************************************************************************************************************************************

Так понял, что доктрина не совсем для этого предназначена (т.е. не получить коллекцию сразу всех связанных объектов, вернее, не имеет смысла), поэтому в данном случае, самое правильное - это просто выполнить тот же запрос (только в контроллере) и получить простой массив записей. Первый вариант верный, см. комментарии.

При этом, в первом варианте было 3 запроса: первый - для Form, остальные два - selectы из FormType, почему только 2 раза, а не один.. А сейчас, соответственно, только этот один запрос и все.

З.Ы. Понял, почему 2 раза - по разу для каждого типа поля (сейчас их всего два). Использовалось бы 20 разных типов полей - было бы 20 запросов.

$questions = $this->getDoctrine()->getConnection()->fetchAll(
            'SELECT f.ru, f.field_name, t.type 
             FROM ey_form f
             JOIN ey_form_type t ON f.field_type = t.id_form_type
             ORDER BY f.id_form');

        $formTypePath = 'AppBundle\\Form\\Type\\';

        $builder = $this->createFormBuilder();
        foreach ($questions as $question) {
            $builder->add(
                $question['field_name'],
                $formTypePath . $question['type'],
                array(
                    'label' => $question['ru']
                )
            );
        }
        $form = $builder->getForm();
     ......
    }
  • Вопрос задан
  • 571 просмотр
Подписаться 2 Простой 2 комментария
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы