2011-12-11 13 views
7

YiiでActiveRecordでサブクエリを作成することは可能ですか?サブクエリActiveRecord Yii

select * from table1 where table1.field1 in (select table2.field2 from table2)

iは現在、休閑コードを使用しています:

は、私はこのようなクエリがある

object1::model()->findAll(array('condition'=>'t.field1 in (select table2.field2 from table2)'))

[編集]
私があれば知りたいのですがSQLを使用せずに、かつ結合を使用せずにサブクエリを構成する方法です。

解決策はありますか?

とありがとうございます。

答えて

10

まずデシベルフィールドでダブレットを見つける:

$model=new MyModel('search'); 
$model->unsetAttributes(); 

$criteria=new CDbCriteria(); 
$criteria->select='col1,col2,col3'; 
$criteria->group = 'col1,col2,col3'; 
$criteria->having = 'COUNT(col1) > 1 AND COUNT(col2) > 1 AND COUNT(col3) > 1'; 

は、サブクエリを取得:

$subQuery=$model->getCommandBuilder()->createFindCommand($model->getTableSchema(),$criteria)->getText(); 

は、サブクエリの条件を追加します。

$mainCriteria=new CDbCriteria(); 
$mainCriteria->condition=' (col1,col2,col3) in ('.$subQuery.') '; 
$mainCriteria->order = 'col1,col2,col3'; 

使い方:

$result = MyModel::model()->findAll($mainCriteria); 

または:

$dataProvider = new CActiveDataProvider('MyModel', array(
     'criteria'=>$mainCriteria, 
)); 

出典:http://www.yiiframework.com/wiki/364/using-sub-query-for-doubletts/

6

いいえ、YiiのCDbCriteriaCActiveRecordを使用してプログラムでサブクエリを作成する方法はありません。 Query Builderのようには見えません。

あなたはまだやることができますしかし、いくつかの異なる方法をサブクエリ:

$results = Object1::model()->findAll(array(
    'condition'=>'t.field1 in (select table2.field2 from table2)') 
); 

あなたはまた、(おそらくサブクエリが遅くなることができ、より高速になる)に参加できます:

$results = Object1::model()->findAll(array(
    'join'=>'JOIN table2 ON t.field1 = table2.field2' 
); 

あなたはfindAllBySqlとの直接SQLクエリをも行うことができます。

$results = Object1::model()->findAllBySql(' 
    select * from table1 where table1.field1 in 
    (select table2.field2 from table2)' 
); 

することができます、しかし、ルで

$model = new MyModel(); 
$results = $model->results; 

一つの興味深い代替アイデアその後、クエリビルダのCDbCommandか何かを使用して、サブクエリを作成すること、およびなりますので、は次のように呼び出され

class MyModel extends CActiveRecord { 
    public function getResults() { 
    return Object1::model()->findAll(array(
     'condition'=>'t.field1 in (select table2.field2 from table2)') 
    ); 
    } 
} 

:ASTこれらそうのように素敵なARスタイルのインターフェイスを提供結果のSQLクエリ文字列をCDbCritera addInCondition()に渡すだけですか?これは動作しますが、それは可能性がありますわからない場合:

$sql = Yii::app()->db->createCommand() 
    ->select('*') 
    ->from('tbl_user') 
    ->text; 
$criteria->addInCondition('columnName',$sql); 

あなたはいつも処理し、何とか同様サブクエリを構築するための基本CDbCriteriaクラスを拡張することができます。あなたが解放できる素敵な拡張を作るかもしれない! :)

私はそれが助けて欲しい!

+0

おかげthaddeusmt、これは一例であり、私のクエリはさらに複雑であり、それは参加してそれを行うことは不可能だ、と私はアクティブなレコードを使用して、それをしたい、私だろうSQLを使用せずにサブクエリを構築する方法がYiiにあるかどうかを知りたいですか? – Youcef04

+0

これはあなたの選択肢です。 3つすべてがCActiveRecordオブジェクトを返すので、技術的にはまだARを使用しています。 AR "スコープ"を使用してクエリをラップして、ARオブジェクトに素敵なAPIを提供することもできます。明らかにあなたが求めた質問はあなたの*実際の質問ではないので、おそらくあなたはそれを編集することができますか?または新しいものを尋ねますか?それに答えることは可能ですか? – thaddeusmt

+0

最初のオプションは私のソリューションです。別のものを探していたのは明らかでした。二番目のオプションはジョインを使用しています。私はその質問を編集しました、そして今、それがより明確になることを望みますか? – Youcef04

0

私はまだ答えを必要とする古いスレッドが、(私のように)多分誰かこのことを知っています。

以前の回答に関連する小さな問題があります。ここに私の増強があるので、:

$model=new SomeModel(); 
$criteria=new CDbCriteria(); 
$criteria->compare('attribute', $value); 
$criteria->addCondition($condition); 
// ... etc 
$subQuery=$model->getCommandBuilder()->createFindCommand($model->getTableSchema(),$criteria)->getText(); 

$mainCriteria=new CDbCriteria(); 
$mainCriteria->addCondition($anotherCondition); 
// ... etc 

// NOW THIS IS IMPORTANT 
$mainCriteria->params = array_merge($criteria->params, $mainCriteria->params); 

// Now You can pass the criteria: 
$result = OtherModel::model()->findAll($mainCriteria); 
関連する問題