2010-12-01 9 views
3

orwhere句(Doctrineを使用)でサブクエリを使用して簡単なクエリを作成しようとしています。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

完全なテーブル名を保持するために、どのような場合は? – ajreal

答えて

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

フルウエルジュウユウユ!クラスの猫を見つけることができませんでした...それは動作しません:\しかしとにかく試していただきありがとう、非常に感謝します。 – TomShreds

2

createSubquery()を使用すると、ネストされたサブクエリについて明示的にdoctrineに伝える必要があります。だからあなたのクエリは次のようになります。

$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/

関連する問題