Symfony. Doctrine. Many-to-One. Выбрать одним запросом, коротко?

Изучаю Symfony. Наверное я чего-то не знаю, но

Есть две таблицы, связь Много-к-1. Ну, скажем. посты и авторы постов

Необходимо получить 10 постов и авторов к ним.



Получаем все посты — это один запрос.

Для каждого поста получаем автора — это на каждый пост по запросу.

Итого 11 запросов. А если надо получить данные не из двух таблиц, а больше?

Другой вариант — ручками собрать запрос в QueryBuilder, но тоже как-то многовато писанины и не получится переиспользовать потом. Билдер только получить уже чего стоит.

Можно сделать отдельный метод в репозитарии, что-то вроде findPostsJoinAuthors(...), там уже запользовать билдер, но все равно, если параметров много, то раздуется метод сильно. Да и таблиц у меня больше двух.



В Yii с этим проще. Прописали (или само сгенерило) связи между моделями и

$post = Post::model()->with('author')->findAllByAttributes(array('category' => 10));<br>
$autor_name = $post->author->name;<br>


и это один запрос.



Вопрос: Как принято поступать в таких случаях и зачем так много писанины для таких простых вещей?



Спасибо.
  • Вопрос задан
  • 4526 просмотров
Пригласить эксперта
Ответы на вопрос 3
Inori
@Inori
Правильный ответ:
«сделать отдельный метод в репозитарии, что-то вроде findPostsJoinAuthors(...), там уже запользовать билдер»

Скорее всего желаемый ответ: проставить fetch=«EAGER» в конфиге связи вот так.
Ответ написан
MuXaJIbI4
@MuXaJIbI4
А зачем закладывать кучу магических методов в ядро если они редко в исходном виде будут пригодны? Не проще ли один раз прописать свой метод в репозитории как надо и пользоваться им.
Ответ написан
hell0w0rd
@hell0w0rd
Просто разработчик
Выкиньте доктирину. Она хоть и универсальная — но жутко не поворотливая, и код у нее с душком. Если посмотреть связи между объектами — вам дурно станет. Все головные объекты внутри ссылаются друг на друга. А уж как запрос собирается… Хотя бы разочек полностью пройдитесь в дебагере по простейшей выборке.
К симфони запросто прикручивается любая другая ОРМ
Ну а если хотите все таки с доктриной возиться — либо fetch=«EAGER», либо в репозитории квери-билдером, или как вам удобнее)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы