我正在尝试使用orWhere子句中的子查询进行简单查询(使用Doctrine)。
与往常一样,Doctrine会尝试重命名每个别名并完全破坏查询......
以下是一个例子:
$q = Doctrine_Query::create()
->from('Actualite a')
->where('a.categorie_id =?', $id)
->orWhere('a.categorie_id IN (select id from cat.categorie as cat where cat.categorie_id =?)', $id)
->execute();
在MySQL中会出现类似的内容:
SELECT *
FROM actualite a
WHERE a.categorie_id = 1 OR a.categorie_id IN (SELECT cat.id FROM categorie cat WHERE cat.categorie_id = 1);
关于它的一切都是对的,但是再一次,Doctrine就会摧毁它: 找不到班猫
每当我尝试使用Doctrine做一些复杂的事情时,我就会出现别名错误。关于如何解决这个问题的任何建议或想法?
谢谢!
答案 0 :(得分:5)
您提供的SQL示例很好,但相应的Doctrine语法有几个错误。这是一个干净的版本:
$q = Doctrine_Query::create()
->select('a.*')
->from('Actualite a')
->where('a.categorie_id = ?', $id)
->orWhere('a.categorie_id IN (SELECT cat.id FROM Categorie cat WHERE cat.categorie_id = ?)', $id)
->execute();
答案 1 :(得分:2)
您应该使用createSubquery()
明确告诉您的嵌套子查询的学说。所以你的查询应该是这样的:
$q = Doctrine_Query::create()
->select('a.*')
->from('Actualite a')
->where('a.categorie_id = ?', $id)
;
$subquery = $q->createSubquery()
->select("cat.id")
->from("Categorie cat")
->where("cat.categorie_id = ?", $id)
;
$q->orWhere('a.categorie_id IN ('.$subquery->getDql().')')->execute();
另一个例子可以在这里找到:
http://www.philipphoffmann.de/2012/08/taming-doctrine-subqueries/
答案 2 :(得分:0)
我认为你的查询应该像这样添加select和remove as
$q = Doctrine_Query::create()
->select('a.id')
->from('Actualite a')
->where('a.categorie_id =?', $id)
->orWhere('a.categorie_id IN (select id from cat.categorie cat where cat.categorie_id =?)', $id)
->execute();
试试这可能会对你有所帮助。
由于