是否可以在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,并且不使用连接。

有什么解决方案吗?

并提前感谢。

===============>>#1 票数:11 已采纳

首先按db字段查找doublets:

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

===============>>#2 票数: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;

一个有趣的替代想法是使用Query Builder的CDbCommand或其他东西创建子查询,然后将生成的SQL查询字符串传递给CDbCritera addInCondition() 不确定这是否有效,但它可能:

$sql = Yii::app()->db->createCommand()
  ->select('*')
  ->from('tbl_user')
  ->text;
$criteria->addInCondition('columnName',$sql);

您始终可以扩展基本CDbCriteria类,以便以某种方式处理和构建子查询。 可能会发布一个很好的扩展你可以释放! :)

我希望有所帮助!

===============>>#3 票数: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);

  ask by Youcef04 translate from so

未解决问题?本站智能推荐:

8回复

yii中的findAll()

EmailArchive表: 现在在Yii我想要记录,其中email_id = 101我正在使用下面的代码,但它不起作用。
1回复

YII CActiveRecord加入运算符

我现在仍在博客教程中学习YII。 我尝试使用CAtiveRecord联接许多表: 但我的结果是这样的: 我需要我的MySQL查询是这样的: 以后编辑 1,定义我的关系和范围
1回复

Yii范围相关模型

我有Page模型,其中HAS_MANY Attachment在页面模型中: 我正在寻找一种对这些附件进行范围界定的方法。 在PageController我有: 例如,在页面视图中,我要: 获取所有附件: $model->attachments (这很好),但
1回复

YII CActiveRecord-> find()

我现在仍在博客教程上学习YII,并对一些代码感到好奇。 在此链接上 http://www.yiiframework.com/doc/blog/1.1/en/prototype.auth 有这样的代码 我对一些代码感到好奇。 为什么在代码的末尾没有?> ?
1回复

无法注销Yii应用程序并强制页面重定向(Yii 1.x)

我试图让我的Yii应用程序在特定类型的用户登录后经过设置的秒数后自动注销。 我对我的protected / components / WebUser.php文件做了以下修改: 在没有活动1小时后,这基本上会从会话中注销“非管理员用户”-这可行,但是我也希望能够将其“强制”返回首页。
2回复

如何在Yii中完成CActiveRecord模型提供的数据?

我正在处理Yii 1.1.16应用程序,并且遇到以下困难: 有一个基于CActiveRecord的模型FooModel 。 它的后面是数据库表bar_table ,它的数据结构非常不方便: 这意味着,我几乎将所有数据作为JSON字符串获取。 (是的,这很疯狂,但是现在我接受了它
1回复

Yii:如何使用最佳方法选择1个注册

我在数据库中有一个表,我想使用UPDATE字段从该表中选择1个注册,例如: 有没有比使用createCommand更好的方式来加载注册? 并且一旦我加载注册,如何更新更新字段? 我希望使用活动记录。
1回复

使用Yii中的CActiveRecord计算相关模型中的列总和

我有2个表:user(id,email,...)和task(id,uid,COMPLAINTS,..) 关系是 我正在网格视图中显示所有用户,并希望添加一列,以显示属于该用户的任务的投诉列的总和。 我可以通过User模型中的STAT关系实现此目的: 但是,当在网格视图中显
2回复

yii CActiveForm客户端验证在某些字段上不起作用

在我的yii应用程序中,我有一个简单的表单,其中包含两个字段,如下所示: “主题”和“消息”是“通知”模型的两个字段。 在通知模型中,我定义了以下规则: 我的问题是验证“主题”有效,但验证“消息”无效! 提交表单后,出现“主题”错误消息,但“消息”没有任何错误。 谁能帮我解
2回复

Yii检查记录是否已经存在于数据库表中

我有2个模型(producten和voorraad)和一个控制器(producten)。 因此,我在生产C R U D(创建/更新)中构建了一个表单。 这是一个自定义表格: 这很容易。 如果您按下按钮addOption ,它将添加一些表单输入。 现在,在保存表单时(这里开始出