No, no hay una manera de construir programáticamente una subconsulta usando Yii's CDbCriteria y CActiveRecord. No parece que el Query Builder tiene una forma, tampoco.
Todavía se puede hacer SUBCONSULTAS algunas maneras diferentes, sin embargo:
$results = Object1::model()->findAll(array(
'condition'=>'t.field1 in (select table2.field2 from table2)')
);
Usted también puede realizar una unión (que probablemente será más rápido, las consultas pueden ser lento):
$results = Object1::model()->findAll(array(
'join'=>'JOIN table2 ON t.field1 = table2.field2'
);
también se puede hacer una consulta SQL directo con findAllBySql:
$results = Object1::model()->findAllBySql('
select * from table1 where table1.field1 in
(select table2.field2 from table2)'
);
puede, sin embargo, en le ast proporcionar una interfaz agradable estilo de AR a éstos, así:
class MyModel extends CActiveRecord {
public function getResults() {
return Object1::model()->findAll(array(
'condition'=>'t.field1 in (select table2.field2 from table2)')
);
}
}
Llamado así:
$model = new MyModel();
$results = $model->results;
Una idea interesante alternativa sería la creación de su subconsulta usando el Generador de consultas CDbCommand o algo así, y luego ¿acaba de pasar la cadena de consulta SQL resultante en un CDbCritera addInCondition()
? No estoy seguro si esto va a funcionar, pero puede ser que:
$sql = Yii::app()->db->createCommand()
->select('*')
->from('tbl_user')
->text;
$criteria->addInCondition('columnName',$sql);
Siempre se puede extender la clase CDbCriteria base para procesar y construir subconsultas alguna manera también. ¡Podría hacer una buena extensión que podría lanzar! :)
espero que ayude!
Gracias thaddeusmt, esto es sólo un ejemplo, mi consulta es aún más complicada, y es imposible hacerlo con une, y quiero hacerlo con registro activo, lo haría ¿Quiere saber si hay una forma en Yii para construir la subconsulta sin usar SQL? – Youcef04
Esas son prácticamente tus opciones. Los tres devuelven los objetos de CActiveRecord, creo, por lo que técnicamente sigues usando AR. Puede usar "ámbitos" de AR para envolver las consultas y también proporcionar una buena API para sus objetos AR. Dado que aparentemente la pregunta que hiciste no es tu pregunta * real *, ¿tal vez podrías editarla? ¿O preguntar uno nuevo? Entonces, ¿es posible responderlo? – thaddeusmt
la primera opción es mi solución, estaba claro que estaba buscando otra, la segunda opción usa combinaciones, eso no puede ayudarme, la tercera no es interesante. Edité la pregunta, y espero que ahora esté más claro. – Youcef04