我正在为Gridview使用生成相关记录搜索查询
我收到此错误:
SQLSTATE [23000]:完整性约束违规:1052列' dbowner'在where子句中含糊不清
正在执行的SQL是:SELECT COUNT(*)FROM tbl_iolcalculation
LEFT JOIN tbl_iolcalculation
patient
ON tbl_iolcalculation
。patient_id
= patient
。{{ 1}} WHERE(id
= 1)AND(dbowner
= 1)
我有两个相关的模型1)iolcalculation和patient - 每个iolcalculation有一个患者(iolcalculation.patient_id - > patient.id)
我的模型IolCalculationSearch中的相关代码是:
dbowner
生成此错误的原因是每个模型都覆盖默认的Where子句,如下所示,原因是需要通过字段dbowner将多个用户数据与其他用户隔离:
public function search($params)
{
$query = IolCalculation::find();
$dataProvider = new ActiveDataProvider([
'query' => $query,
]);
$dataProvider->sort->attributes['patient.lastname'] = [
'asc' => ['patient.lastname' => SORT_ASC],
'desc' => ['patient.lastname' => SORT_DESC],
];
$query->joinWith(['patient'=> function($query) { $query->from(['patient'=>'tbl_iolcalculation']); } ]);
if (!($this->load($params) && $this->validate())) {
return $dataProvider;
}
$query->andFilterWhere([
'id' => $this->id,
'patient_id' => $this->patient_id,
'preop_id' => $this->preop_id,
'calculation_date' => $this->calculation_date,
'iol_calculated' => $this->iol_calculated,
这是在扩展ActiveRecord的基础模型中定义的,然后所有工作模型都扩展了这个基础模型
如何在MySQL代码中解决这个模棱两可的引用? 提前致谢
答案 0 :(得分:3)
$query->andFilterWhere([
// previous filters
self::tableName() . '.structure_id' => $this->structure_id,
// next filters
]);
答案 1 :(得分:1)
我认为,您正在搜索表别名。 (https://github.com/yiisoft/yii2/issues/2377)
像这样,当然你必须改变你的其余代码:
$query->joinWith(['patient'=> function($query) { $query->from(['patient p2'=>'tbl_iolcalculation']); } ]);
答案 2 :(得分:0)
我能让它工作的唯一方法是覆盖我为大多数模型设置的默认范围查找,以便它包含实际的表名,如下所示 - 在我的模型定义中:
public static function find() {
$session = new Session();
$session->open();
return parent::find()->where(['tbl_iolcalculation.dbowner'=> $session['dbowner']]);
}
使用别名可能有更优雅的方式,所以任何建议都会受到赞赏 - 将别名添加到where子句会很好,我看到他们正在研究这个....