いいえ、YiiのCDbCriteriaとCActiveRecordを使用してプログラムでサブクエリを作成する方法はありません。クエリビルダーにも方法があるようには見えません。
ただし、サブクエリはいくつかの異なる方法で実行できます。
$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)'
);
ただし、少なくとも次のように、これらに優れたARスタイルのインターフェイスを提供できます。
class MyModel extends CActiveRecord {
public function getResults() {
return Object1::model()->findAll(array(
'condition'=>'t.field1 in (select table2.field2 from table2)')
);
}
}
そのように呼ばれる:
$model = new MyModel();
$results = $model->results;
興味深い代替案の1つは、クエリビルダーのCDbCommandなどを使用してサブクエリを作成し、結果のSQLクエリ文字列をCDbCriteraに渡すことaddInCondition()
です。これが機能するかどうかはわかりませんが、次の可能性があります。
$sql = Yii::app()->db->createCommand()
->select('*')
->from('tbl_user')
->text;
$criteria->addInCondition('columnName',$sql);
基本CDbCriteriaクラスをいつでも拡張して、サブクエリを処理および構築することもできます。あなたがリリースできる素晴らしい拡張機能を作るかもしれません!:)
お役に立てば幸いです。