2015-04-01 46 views
2

我生成相關記錄的搜索查詢的GridView使用的Yii 2的GridView - 搜索查詢產生曖昧領域

我得到這個錯誤: SQLSTATE [23000]:完整性約束違規:1052列「的dbowner」在where子句含糊不清 正在執行的SQL是:SELECT COUNT(*)FROM tbl_iolcalculation LEFT JOIN tbl_iolcalculationpatient ON tbl_iolcalculationpatient_id = patientid WHERE(dbowner = 1)AND(dbowner = 1)

我有兩個相關的模型1)iolcalculation和患者 - 每個iolcalculation具有一個患者(iolcalculation.patient_id - > patient.id)

相關的代碼在我的模型IolCalculationSearch是:

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, 

產生這個錯誤的原因是,每個模型都有一個覆蓋到默認Where子句如下,爲多個用戶數據的原因需要從其他用戶隔離,通過領域dbowner:

public static function defaultWhere($query) { 
    parent::init(); 
    $session = new Session(); 
    $session->open(); 

    $query->andWhere(['t.dbowner' => $session['dbowner']]); 
} 

這是在擴展ActiveRecord的一個基礎模型定義,然後所有工作模式擴展這個示範基地

如何解決在MySQL代碼這個曖昧的參考? 在此先感謝

回答

1

我認爲,你正在尋找表別名。 (https://github.com/yiisoft/yii2/issues/2377

這樣,當然你必須改變你的代碼的其餘部分:

$query->joinWith(['patient'=> function($query) { $query->from(['patient p2'=>'tbl_iolcalculation']); } ]); 
+0

導致同樣的錯誤只P2說:SQLSTATE [23000]:完整性約束衝突:1052 where子句中的'dbowner'列含糊不清 正在執行的SQL是:SELECT COUNT(*)FROM'tbl_iolcalculation' LEFT JOIN'tbl_iolcalculation'' patient p2' ON'tbl_iolcalculation'.'patient_id' ='patient p2'。 'id' WHERE('dbowner' = 1)AND('dbowner' = 1)******我需要的是以某種方式將別名添加到'downer'列 - 感謝您的考慮 – gpc 2015-04-01 22:25:26

0

我能得到這個工作的唯一方法是重寫發現我已經設置默認範圍對於大多數車型,所以它包括實際表名稱如下 - 在我的模型定義:

public static function find() { $session = new Session(); $session->open(); return parent::find()->where(['tbl_iolcalculation.dbowner'=> $session['dbowner']]); }

有可能是使用別名更優雅的方式,所以任何的建議是讚賞 - 將是不錯的別名添加到WHERE子句,我看到他們在這方面的工作....

2
$query->andFilterWhere([ 
    // previous filters 
    self::tableName() . '.structure_id' => $this->structure_id, 
    // next filters 
]); 
+0

謝謝 - 工作 – gpc 2016-07-26 14:48:40