0

我有 Doctrine2 DQL 查询,但我想用 QueryBuilder 构建它,我注意到生成的 DQL 与手工制作的 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)

正如你所看到的,这个缺失的部分是手工制作的(第一行):

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'

欢迎任何想法。

4

2 回答 2

1

似乎 DQL 解析器错误地将连接定位到错误的位置。

我最初的建议是尝试只制作 1 个 FROM 项目和一个子选择。另外,如果您在我们的错误跟踪中添加您在此处询问的相同内容,我会很高兴:http: //www.doctrine-project.org/jira/browse/DDC

非常感谢!

Guilherme Blanco Doctirne 核心开发人员

于 2011-03-11T17:57:33.353 回答
0

他们没有失踪。刚刚重新排序

INNER JOIN fl.site fls INNER JOIN fl.folder flf

于 2011-03-10T15:53:21.840 回答