在我的一个项目中,我的数据库中有两个实体作为表格。
实体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方法,但在我的情况下似乎不起作用。 有人有类似的问题吗?
感谢所有帮助
答案 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子句并想要加入该表,你可以做类似的事情。
假设我们有两个模型Yii2
和Products
。 Category
有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
希望这能解决您的问题