使用带有别名的doctrine / Errors的子查询

时间:2010-12-01 15:45:17

标签: php mysql orm doctrine

我正在尝试使用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做一些复杂的事情时,我就会出现别名错误。关于如何解决这个问题的任何建议或想法?

谢谢!

3 个答案:

答案 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();

试试这可能会对你有所帮助。

由于