Yii2,在连接中合并两个活动查询条件

时间:2018-02-04 20:43:43

标签: mysql activerecord yii yii2

在我的一个项目中,我的数据库中有两个实体作为表格。

  1. 实体A(从现在开始在A上调用)
  2. 实体B(从现在开始在B上调用)
  3. 实体A与B有1:n关系。

    使用yii2我创建了两个带关系的ActiveRecord模型(gii自动创建)。

    在我项目的某个控制器中,我生成(通过模型函数)两个活动查询:

    $query1 = \app\models\A::generateQuery(); // Return \app\models\A::find()->where([//condictions for A])
    
    $query2 = \app\models\B::generateQuery(); // Return \app\models\B::find()->where([//condictions for B])
    

    在找到结果之前,我想加入两个实体并连接两个实例,但将它们保持为独立的活动查询。

    理想的命令表达应该是:

    $query1->join($query2);
    

    sql结果应为:

    SELECT * 
    FROM A JOIN B ON a.id = b.rif_a_entity 
    WHERE a.field = 1 AND b.field = 2
    

    我尝试使用MongoDB Production Notes方法,但在我的情况下似乎不起作用。 有人有类似的问题吗?

    感谢所有帮助

1 个答案:

答案 0 :(得分:1)

您可以使用leftJoin以下列方式实现此目的

app\models\A::find()
->leftJoin('{{%B}}', '{{%A}}.[[id]] = {{%B}}.[[rif_a_entity]]')
->where(['=','{{%A}}.[[field]]',1])
->andWhere(['=','{{%B}}.[[field]]',1])
->all();

验证上面的查询是否生成了正确的sql,你需要删除它 ->all()从最后一行替换为->createCommand()->rawSql,并如下所示回显整个查询并进行相应调整。您可以复制SQL并在phpmyadmin窗口中运行以验证结果集

app\models\A::find()
->leftJoin('{{%B}}', '{{%A}}.[[id]] = {{%B}}.[[rif_a_entity]]')
->where(['=','{{%A}}.[[field]]',1])
->andWhere(['=','{{%B}}.[[field]]',1])
->createCommand()->rawSql;

编辑

在讨论之后,您希望将查询分开并且不想使用上面提出的解决方案,我建议您使用joinWith而不是尝试合并/加入2 {{1}在你试图做的对象中,ActiveQuery以某种方式支持Yii1,但在CDbCriteria::merge()中,对象的合并已被joinWithRelations替换,所以因为你想从其中一个查询中重新使用where子句并想要加入该表,你可以做类似的事情。

假设我们有两个模型Yii2ProductsCategory有foreign_key Products。我会在模型cat_id中将关系定义为Category

hasMany()

然后,假设我的情况与您相同,我希望将这两个查询分开,同时,我想将public function getProducts(){ return $this->hasMany(Products::className(),['cat_id'=>'id']); } 加入Category并使用{{ 1}}现有Products模型查询的条件。

where

如果您尝试查看到目前为止构建的查询,请将Products添加到上面。

$cat=app\models\Category:find()->where(['=','status',1]);
$prod=app\models\Products:find()->where(['=','status',1]);

//in the first line below products is the name of the relation 
//and the second line is  how you merge the where clause from the $prod query with $cat query
$cat->joinWith(['products'])
->andWhere($prod->where);

这将输出以下查询

createCommand()->rawSql

希望这能解决您的问题