8

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

私はこのようなクエリを持っています:

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

私は現在休眠コードを使用しています:

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

[編集]
SQLを使用せず、結合を使用せずにサブクエリを作成する方法があるかどうかを知りたいです。

解決策はありますか?

よろしくお願いします。

4

3 に答える 3

11

まず、dbフィールドでダブレットを見つけます。

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

于 2012-08-30T08:49:11.103 に答える
6

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

ただし、サブクエリはいくつかの異なる方法で実行できます。

$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クラスをいつでも拡張して、サブクエリを処理および構築することもできます。あなたがリリースできる素晴らしい拡張機能を作るかもしれません!:)

お役に立てば幸いです。

于 2011-12-12T02:32:52.173 に答える
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);
于 2016-07-26T20:16:22.167 に答える