我有一个策略表和一个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 policy
。chapter_id
= policy_chapter
。id
WHERE(id
='280')AND(policy_chapter
。client_id
= 1 )
它失败,因为它是在id上搜索,策略和policy_chapter表都有一个id字段。我无法弄清楚如何消除id的歧义。
答案 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;
}
}