Мне нужно было сделать самообъединение на столе, и так как я не мог сделать с помощью DQL, я пошел на SQL. Вот запрос:
select child.*, parent.* from gamme child
left join gamme parent on child.gamme_parent = parent.gamme_id
where child.gamme_catalogue_id = {an id}
Когда я запустил этот запрос в TOAD, я получил ожидаемые результаты:
+------------+-------------+------------+------------+------------+------------+
| column_a | column_b | column_c | column_a_1 | column_b_1 | column_c_1 |
+------------+-------------+------------+------------+------------+------------+
| | | | | | |
+------------+-------------+------------+------------+------------+------------+
Теперь, когда я пытаюсь var_dump
тот же запрос в PHP, я не получаю никаких данных соединения:
Вот мой PHP-код:
$em = $this->getEntityManager();
$connection = $em ->getConnection();
$query = "select child.*, parent.* from gamme child
left join gamme parent on child.gamme_parent = parent.gamme_id
where child.gamme_catalogue_id =".$catId;
$stmt = $connection->prepare($query);
$stmt->execute();
$result = $stmt->fetchAll();
var_dump($result);
Вот что var_dump
дает мне:
array
0 =>
array (size=3)
'column_a' => {some values}
'column_b' => {some values}
'column_c' => {some values}
1 =>
array (size=3)
'column_a' => {some values}
'column_b' => {some values}
'column_c' => {some values}
...
Как я могу получить данные соединения тоже в PHP?
РЕДАКТИРОВАТЬ
Поскольку я не мог понять, почему я не получаю данные соединения с SQL, мне наконец удалось заставить его работать с самим DQL.
Вот как я это сделал для тех, кто может искать решение о присоединении к сущности Doctrine:
$qb = $this
->_em
->createQueryBuilder();
$qb
->select('c', 'g', 'p')
->from('CatalogueBundle:Catalogue', 'c')
->leftJoin('c.gammes', 'g')
//"gammes" is found in entity "Catalogue" and targets entity "Gamme"->leftJoin('g.parent', 'p')
//"parent" is found in entity "Gamme" and targets entity "Gamme" itself
->where('c.catalogueId =:catId')
->setParameter('catId', $catId);
$result = $qb->getQuery()->getArrayResult();
Задача ещё не решена.
Других решений пока нет …