いいえ、YiiのCDbCriteriaとCActiveRecordを使用してプログラムでサブクエリを作成する方法はありません。 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クラスを拡張することができます。あなたが解放できる素敵な拡張を作るかもしれない! :)
私はそれが助けて欲しい!
おかげthaddeusmt、これは一例であり、私のクエリはさらに複雑であり、それは参加してそれを行うことは不可能だ、と私はアクティブなレコードを使用して、それをしたい、私だろうSQLを使用せずにサブクエリを構築する方法がYiiにあるかどうかを知りたいですか? – Youcef04
これはあなたの選択肢です。 3つすべてがCActiveRecordオブジェクトを返すので、技術的にはまだARを使用しています。 AR "スコープ"を使用してクエリをラップして、ARオブジェクトに素敵なAPIを提供することもできます。明らかにあなたが求めた質問はあなたの*実際の質問ではないので、おそらくあなたはそれを編集することができますか?または新しいものを尋ねますか?それに答えることは可能ですか? – thaddeusmt
最初のオプションは私のソリューションです。別のものを探していたのは明らかでした。二番目のオプションはジョインを使用しています。私はその質問を編集しました、そして今、それがより明確になることを望みますか? – Youcef04