Doctrine 2 QueryBuilder против DQL с ручным кодированием - разные результаты - PullRequest
0 голосов
/ 10 марта 2011

У меня есть DQL-запрос Doctrine2, но я хочу построить его с помощью QueryBuilder, я заметил, что созданный DQL несколько отличается от созданного вручную, и мне интересно, чего мне здесь не хватает - может быть, я чего-то не знаю или неправильно делаешь?

Хорошо, некоторые детали:

Мой запрос, сделанный вручную, выглядит следующим образом:

select count(fi.id) 
from Entities\Content\FolderLookup fl 
join fl.site fls 
join fl.folder flf,
Entities\Content\FolderItem fi 
join fi.site fis 
join fi.folder fif 
join fi.item it 
join it.type tp 
join it.content ic 
where fl.namePath = ?1 
and tp.name = ?2 
and fls.id = fis.id 
and flf.id = fif.id

Теперь я пытаюсь воспроизвести это с помощью QueryBuilder:

$qb->select("count(fi.id)")->from("Entities\Content\FolderLookup", "fl")->join("fl.site","fls")->join("fl.folder", "flf");

$qb->from("Entities\Content\FolderItem","fi")->join("fi.site","fis")->join("fi.folder","fif");
$qb->join("fi.item","it")->join("it.type","tp")->join("it.content","ic");

$wherePart = $qb->expr()->andx();
$wherePart->add($qb->expr()->eq("fl.namePath","?1"));
$wherePart->add($qb->expr()->eq("tp.name","?2"));
$wherePart->add($qb->expr()->eq("fls.id","fis.id"));
$wherePart->add($qb->expr()->eq("flf.id","fif.id"));

$qb->where($wherePart);

Это, однако, производит этот запрос DQL:

SELECT count(fi.id) FROM Entities\Content\FolderLookup fl, 
Entities\Content\FolderItem fi 
INNER JOIN fl.site fls 
INNER JOIN fl.folder flf 
INNER JOIN fi.site fis 
INNER JOIN fi.folder fif 
INNER JOIN fi.item it 
INNER JOIN it.type tp 
INNER JOIN it.content ic 
WHERE (fl.namePath = ?1) 
AND (tp.name = ?2) 
AND (fls.id = fis.id) 
AND (flf.id = fif.id)

Как вы можете видеть, есть часть этого отсутствующего comapring к ручной (Первая строка):

fl join fl.site fls join fl.folder flf

Я не уверен, почему эти объединения отсутствуют, поскольку я определяю их здесь:

$qb->select("count(fi.id)")->from("Entities\Content\FolderLookup", "fl")->join("fl.site","fls")->join("fl.folder", "flf");

Обновление:

Самое интересное начинается, когда DQL переводится в SQL - в данном случае MySQL:

Сделанный вручную становится:

SELECT count(f0_.id) AS sclr0 FROM FolderLookup f1_ INNER JOIN Site s2_ ON f1_.site_id = s2_.id INNER JOIN Folder f3_ ON f1_.folder_id = f3_.id, FolderItem f0_ INNER JOIN Site s4_ ON f0_.site_id = s4_.id INNER JOIN Folder f5_ ON f0_.folder_id = f5_.id INNER JOIN Item i6_ ON f0_.item_id = i6_.id INNER JOIN ItemType i7_ ON i6_.type_id = i7_.id INNER JOIN ItemContent i8_ ON i6_.content_id = i8_.id WHERE f1_.namePath = ? AND i7_.name = ? AND s2_.id = s4_.id AND f3_.id = f5_.id

Там, где генерируется, выглядит так:

SELECT count(f0_.id) AS sclr0 FROM FolderLookup f1_, FolderItem f0_ INNER JOIN Site s2_ ON f1_.site_id = s2_.id INNER JOIN Folder f3_ ON f1_.folder_id = f3_.id INNER JOIN Site s4_ ON f0_.site_id = s4_.id INNER JOIN Folder f5_ ON f0_.folder_id = f5_.id INNER JOIN Item i6_ ON f0_.item_id = i6_.id INNER JOIN ItemType i7_ ON i6_.type_id = i7_.id INNER JOIN ItemContent i8_ ON i6_.content_id = i8_.id WHERE (f1_.namePath = ?) AND (i7_.name = ?) AND (s2_.id = s4_.id) AND (f3_.id = f5_.id)

И это неверное утверждение, поскольку база данных возвращается с:

Column not found: 1054 Unknown column 'f1_.site_id' in 'on clause'

Любые идеи приветствуются.

Ответы [ 2 ]

1 голос
/ 11 марта 2011

Похоже, что синтаксический анализатор DQL неправильно позиционирует соединения с.

Мое первоначальное предложение - попытаться сделать только 1 элемент ИЗ и подвыбор.Кроме того, я хотел бы, чтобы вы добавили тот же контент, который вы просили здесь, в нашем отслеживании ошибок: http://www.doctrine -project.org / jira / browse / DDC

Большое спасибо!

Разработчик ядра Guilherme Blanco Doctirne

0 голосов
/ 10 марта 2011

они не пропали.только что переупорядочено

ВНУТРЕННЕЕ СОЕДИНЕНИЕ

...