Yii2 ActiveQuery消歧

时间:2017-04-28 20:35:14

标签: yii2

我有一个策略表和一个policy_chapter表。我想修改我的PolicyQuery,以便它只显示属于该客户端的章节中的策略。这是我在PolicyQuery中扩展ActiveQuery的代码:

public function one($db = null)
{
    if (Yii::$app->user->can('Admin')) return parent::one($db);
    if (Yii::$app->user->can('PolicyUser')) {
        $this->joinWith('chapter')->andWhere(['policy_chapter.client_id'=>Yii::$app->user->identity->client_id]);
        return parent::one($db);
    }
}

如果用户具有管理员权限,那么他可以查看任何策略。如果他具有PolicyUser访问权限,那么它将确保他无法访问其他客户端章节中的策略。但是我得到了这个错误:

SQLSTATE [23000]:完整性约束违规:1052 where子句中的列'id'不明确正在执行的SQL是:SELECT policy。* FROM policy LEFT JOIN policy_chapter ON policychapter_id = policy_chapterid WHERE(id ='280')AND(policy_chapterclient_id = 1 )

它失败,因为它是在id上搜索,策略和policy_chapter表都有一个id字段。我无法弄清楚如何消除id的歧义。

3 个答案:

答案 0 :(得分:0)

我通过更改策略控制器中的findModel方法解决了这个问题。我用Policy::findOne($id)

替换了Policy::find()->where('policy.id = :id',[':id'=>$id])->one()来电

这消除了政策ID的歧义。

答案 1 :(得分:0)

将您的查询修改为:

public function one($db = null)
{
    if (Yii::$app->user->can('Admin')) return parent::one($db);
    if (Yii::$app->user->can('PolicyUser')) {
        $this->joinWith('chapter as cha')->alias('t')->andWhere(['policy_chapter.client_id'=>Yii::$app->user->identity->client_id]);
        return parent::one($db);
    }
}

然后您可以使用cha.id引用policy_chapter表和t.id引用policy表。

答案 2 :(得分:0)

尝试:

public function one($db = null)
{
    if (Yii::$app->user->can('Admin')) return parent::one($db);
    if (Yii::$app->user->can('PolicyUser')) {
        $sql = $this->joinWith('chapter')->andWhere(['policy_chapter.client_id'=>Yii::$app->user->identity->client_id])->andWhere(['policy.id' => $this->id])->createCommand()->getRawSql();

       $model = Policy::findBySql($sql)->one();

       return $model;
    }
}