0

Doctrine2 DQL クエリを持っていますが、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)

ご覧のとおり、手作りのものと比較すると、この行方不明の部分があります (最初の行):

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 に答える