【问题标题】:Doctrine 2 QueryBuilder vs Handcoded DQL - different resultsDoctrine 2 Query Builder vs Hard Coded SQL - 不同的结果
【发布时间】:2011-03-10 15:30:22
【问题描述】:

我有 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'

欢迎任何想法。

【问题讨论】:

    标签: php doctrine-orm dql


    【解决方案1】:

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

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

    非常感谢!

    吉尔赫姆·布兰科 Doctirne 核心开发者

    【讨论】:

      【解决方案2】:

      它们并没有丢失。刚刚重新排序

      内部连接 ​​fl.site fls INNER JOIN fl.folder flf

      【讨论】:

      • 我已经用更多信息更新了帖子 - 我想知道为什么从这些生成的 sql 不同
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-04
      • 2015-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多