2010-12-01 75 views
3

我想在orWhere子句(与教义)中的子查询做一个简单的查询。与教条/使用别名的错误使用子查询

与往常一样,学说试图每一个别名重命名和完全破坏查询...

下面是一个例子:

$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复杂的事情时,我都有别名错误。任何关于如何解决这个问题的建议或想法?

谢谢!

+0

如果有什么要保留完整的表名? – ajreal 2010-12-03 18:44:07

回答

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(); 
0

我想你查询应该是这样的添加选中并删除作为

$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(); 

试试这个可以帮助你。

谢谢

+0

FUUUUUUUUUUUUUUUUU !!!无法找到课堂猫...它不工作:\但谢谢你试试反正,非常感激。 – TomShreds 2010-12-01 19:56:05

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/