Yii2合并查询,如yii1中的cdbcriteria

时间:2014-11-27 18:57:19

标签: mysql yii2

我有关于多个查询合并的问题。 在Yii 1.x中,您可以将CDbCriteria与

合并
$criteria->merge($otherCriteria)

如何在Yii2中使用查询实现相同的嵌套条件等?

修改 假设我想要单独的查询来形成子查询。在完成所有子查询之后,我想将它们合并到一个大查询中。

3 个答案:

答案 0 :(得分:5)

CDbCriteria中没有Yii2概念了。相反,您可以参考以下类:

您之前使用CDbCriteria所做的一切,现在您可以使用上述课程。因此,没有必要将两个标准相互合并。

<强>更新

Yii2还支持以下子查询(如Yii2官方指南):

$subQuery = (new Query)->select('COUNT(*)')->from('user');
$query = (new Query)->select(['id', 'count' => $subQuery])->from('post');

结果是:

SELECT `id`, (SELECT COUNT(*) FROM `user`) AS `count` FROM `post`

http://www.yiiframework.com/doc-2.0/guide-db-query-builder.html#building-query

答案 1 :(得分:4)

我最近也碰到了这个问题。完全融合查询(选择,加入等)不存在(据我所知)。但您可以手动合并条件,例如:

    $query1 = \app\models\User::find()
        ->where(['column1' => 'value1', 'column2' => 'value2']);

    $query2 = \app\models\User::find()
        ->where(['and', '[[column3]] = :column3', '[[column4]] = :column4'])
        ->addParams([
            ':column3' => 'value3',
            ':column4' => 'value4'
        ]);

    // merge conditions
    $query1->orWhere($query2->where);
    $query1->addParams($query2->params);

    // build SQL
    echo $query1->createCommand()->rawSql;

构建SQL:

SELECT * FROM `yii2_user` WHERE 
    ((`column1`='value1') AND (`column2`='value2')) OR 
    ((`column3` = 'value3') AND (`column4` = 'value4'))

答案 2 :(得分:0)

除了上面的优秀答案之外,如果您需要合并两个条件以发送到采用与where()相同格式的'condition'参数的方法,那么您可以构建自己的阵列:

$condition1 = ['column1' => 'value1', 'column2' => 'value2'];
$condition2 = ['column3' => 'value3', 'column4' => 'value4'];
$condition = [
    'or',
    $condition1,
    $condition2,
];
$model->updateAll([ 'column5' => 'value5' ], $condition);

或者,如果感觉更合乎逻辑,您可以使用临时查询对象来构建条件并合并等。然后从中传递生成的where条件,例如:

$query1 = new \yii\db\Query;
$query1->andWhere(['column1' => 'value1', 'column2' => 'value2']);
$query2 = new \yii\db\Query;
$query2->andWhere(['column3' => 'value3', 'column4' => 'value4']);
$query = new \yii\db\Query;
$query->where($query1->where)
      ->orWhere($query2->where);

$model->updateAll([ 'column5' => 'value5' ], $query->where);

显然,当在代码中的其他地方构建查询或条件并单独传递执行模型方法的位置时,这更有意义。