Non, il n'y a pas de moyen de construire une sous-requête de manière programmatique en utilisant la méthode de Yii. CDbCriteria y CActiveRecord . Il ne semble pas que le Constructeur de requêtes a un moyen, non plus.
Vous pouvez néanmoins effectuer des sous-requêtes de plusieurs manières différentes :
$results = Object1::model()->findAll(array(
'condition'=>'t.field1 in (select table2.field2 from table2)')
);
Vous pouvez également effectuer une jointure (qui sera probablement plus rapide, les sous-requêtes pouvant être lentes) :
$results = Object1::model()->findAll(array(
'join'=>'JOIN table2 ON t.field1 = table2.field2'
);
Vous pouvez aussi faire une requête SQL directe avec findAllBySql :
$results = Object1::model()->findAllBySql('
select * from table1 where table1.field1 in
(select table2.field2 from table2)'
);
Cependant, vous pouvez au moins leur fournir une interface agréable de type AR, comme ceci :
class MyModel extends CActiveRecord {
public function getResults() {
return Object1::model()->findAll(array(
'condition'=>'t.field1 in (select table2.field2 from table2)')
);
}
}
Appelé comme ça :
$model = new MyModel();
$results = $model->results;
Une autre idée intéressante serait de créer votre sous-requête à l'aide de l'outil de création de requêtes CDbCommand ou quelque chose comme ça, et ensuite passer la chaîne de requête SQL résultante dans un CDbCritera addInCondition()
? Je ne sais pas si ça va marcher, mais ça pourrait :
$sql = Yii::app()->db->createCommand()
->select('*')
->from('tbl_user')
->text;
$criteria->addInCondition('columnName',$sql);
Vous pouvez toujours étendre la classe CDbCriteria de base pour traiter et construire des sous-requêtes d'une manière ou d'une autre. Cela pourrait faire une belle extension que vous pourriez publier ! :)
J'espère que cela vous aidera !