Php Yii2-添加到子查询where部分的onCondition

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

我注意到在v2.1中,onCondition被添加到where条件中-

我不知道为什么,但这影响了我使用下面的关系

我正在为一个新项目开发RBAC模块。我没有使用Yii2的默认值,因为它是一个SaaS系统,角色必须根据
帐户定义,我们宁愿使用
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()