Как соединить две таблицы в Doctrine2 с помощью Query Builder, если отношения между таблицами не установлены? - PullRequest
4 голосов
/ 27 марта 2012

В настоящее время я использую Symfony2 и Doctrine2 и пытаюсь объединить две таблицы вместе с помощью построителя запросов.

Проблема, с которой я столкнулся, заключается в том, что все мои аннотированные сущности не имеют настройки отношений таблиц.В какой-то момент я расскажу об этом, но в то же время мне нужно попытаться обойти это.

В основном у меня есть две таблицы: таблица продуктов и таблица product_description.В таблице product хранится основная информация, а затем у меня есть таблица product_description, в которой хранится информация описания.У продукта может быть одно или несколько описаний в зависимости от языка.

Я хочу использовать построитель запросов, чтобы я мог получать результаты product и product_description в виде объектов.

В данный момент я используюследующий код:

// Get the query builder
$qb = $em->createQueryBuilder();

// Build the query
$qb->select(array('p, pd'));
$qb->from('MyCompanyMyBundle:Product', 'p');
$qb->innerJoin('pd', 'MyCompanyMyBundle:ProductDescription', 'pd', 'ON', $qb->expr()->eq('p.id', 'pd.departmentId'));
$query = $qb->getQuery();
$products = $query->getResult();

Это дает мне следующую ошибку:

[Syntax Error] line 0, col 71: Error: Expected Doctrine\ORM\Query\Lexer::T_DOT, got 'MyCompanyMyBundle:ProductDescription'

Может кто-нибудь указать мне правильное направление?Я готов сделать это по-другому, если есть альтернатива.

1 Ответ

8 голосов
/ 27 марта 2012

Без определения отношений, я не думаю, что вы можете присоединиться к таблицам. Это потому, что когда вы используете DQL, вы запрашиваете объект, а не таблицу, и если объекты не знают друг о друге, вы не можете присоединиться к ним.

Я думаю, вам стоит взглянуть на NativeQuery. Из документов :

NativeQuery позволяет выполнять собственные операторы SELECT SQL, отображая результаты в соответствии с вашими спецификациями. Такая спецификация, которая описывает, как набор результатов SQL сопоставляется с результатом Doctrine, представлена ​​ResultSetMapping. Он описывает, как каждый столбец результата базы данных должен отображаться Doctrine в терминах графа объектов. Это позволяет сопоставить произвольный код SQL с объектами, такими как оптимизированный для поставщика SQL или хранимые процедуры.

По сути, вы пишете сырой SQL, но говорите Doctrine, как сопоставить результаты с вашими существующими сущностями.

Надеюсь, это поможет.

...