Есть 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();
......
}