Php Yii2-添加到子查询where部分的onCondition
我注意到在v2.1中,onCondition被添加到where条件中- 我不知道为什么,但这影响了我使用下面的关系 我正在为一个新项目开发RBAC模块。我没有使用Yii2的默认值,因为它是一个SaaS系统,角色必须根据Php Yii2-添加到子查询where部分的onCondition,php,yii,yii2,rbac,Php,Yii,Yii2,Rbac,我注意到在v2.1中,onCondition被添加到where条件中- 我不知道为什么,但这影响了我使用下面的关系 我正在为一个新项目开发RBAC模块。我没有使用Yii2的默认值,因为它是一个SaaS系统,角色必须根据帐户定义,我们宁愿使用id而不是名称作为唯一键,并且我们不喜欢命名约定 我有表权限,特权和角色 特权-[id,name]您可以在系统中执行的操作 角色-[account\u id,id,name]-每个帐户的不同角色 权限-[parent\u type,parent\u id,ch
帐户定义,我们宁愿使用id
而不是名称作为唯一键,并且我们不喜欢命名约定
我有表权限
,特权
和角色
特权-[id,name]
您可以在系统中执行的操作
角色-[account\u id,id,name]
-每个帐户的不同角色
权限-[parent\u type,parent\u id,child\u type,child\u id]
-角色到权限,角色到角色,权限到权限的映射
现在的问题是我需要findAll
permissions
,并获取具有适当对象的子/父对象
对于父母,我有
public function getParentPrivilege($type) {
return $this->hasOne(Privilege::className(), ['id' => 'parent_id'])->onCondition('parent_type = "privilege"');
}
public function getParentRole() {
return $this->hasOne(Role::className(), ['id' => 'parent_id'])->onCondition('parent_type = "role"');
}
public function getParent(){
if($this->parentPrivilege)
return $this->parentPrivilege;
else
return $this->parentRole;
}
然后我通过以下方式进行查找:
$permissions = \app\models\Permission::find()
->joinWith(['parentRole','parentPrivilege'])
->all();
问题是,onCondition
在SQL on条件中使用,因为我使用了joinWith
,但是onCondition
仍然被添加到父查询的where
子句中,如下所示
SELECT `permissions`.* FROM `permissions`
LEFT JOIN `roles` ON (`permissions`.`parent_id` = `roles`.`id`) AND (parent_type = "role")
LEFT JOIN `privileges` ON (`permissions`.`parent_id` = `privileges`.`id`) AND (parent_type = "privilege")
SELECT * FROM `roles` WHERE (`id` IN ('3', '1', '4', '2', '25')) AND (parent_type = "role")
SELECT * FROM `privileges` WHERE (`id` IN ('5')) AND (parent_type = "privilege")
为什么
将和(parent_type=“role”)
和和(parent_type=“privilege”)
添加到以下关系查询中是没有意义的
我怎样才能做到这一点呢?正如我们在onCondition中看到的那样,它不会影响joinWith()
尝试从关系的degrations中删除onCondition,并像这样重写查询
$permissions = \app\models\Permission::find()
->joinWith([
'parentRole' => function ($query) {
$query->andOnCondition('parent_type = "role"');
},
'parentPrivilege' => function ($query) {
$query->andOnCondition('parent_type = "privilege"');
}
])->all();
有趣。将进行测试。但如果我不得不离开亲戚关系,那就太糟糕了。这意味着使用该关系的代码的每个部分都必须知道使用joinWith
,额外的onCondition
sy您可以从\yii\db\ActiveQuery类继承一个新的查询类,并在您的模型中使用它。为此,您需要在模型中重新定义find()方法。然后,您可以在此查询类中创建新方法,并将其与逻辑连接起来。在这种情况下,您将能够调用\app\models\Premission::find()->withParent()->all()