摘要:于是就會報出這樣一個錯誤要在兩個數據庫同一臺服務器上進行關聯數據查詢,純語句如下轉化成語句時默認不會在表明前添加數據庫名,于是在執行語句時就會默認此表在數據庫下。默認是這樣的只需要在表明前添加數據庫名為了提高代碼穩定性,可以這樣寫
現在在 user 表生成的 GridView 列表中展示 user_stat 中的統計數據背景:在一個mysql服務器上(注意:兩個數據庫必須在同一個mysql服務器上)有兩個數據庫:
memory (存儲常規數據表) 中有一個 user 表(記錄用戶信息)
memory_stat (存儲統計數據表) 中有一個 user_stat (記錄用戶統計數據)
只需要在User的model類中添加關聯
public function getStat() { return $this->hasOne(UserStat::className(), ["user_id" => "id"]); }
在GridView就可以這樣使用來展示統計數據
= GridView::widget([ "dataProvider" => $dataProvider, "columns" => [ //其他列 [ "label" => "統計數據", "value" => function($model){ return isset($model->stat->data) ? $model->stat->data : null; } ], //其他列 ], ]); ?>現在增加了一個需求,需要在user GridView 列表中對統計數據進行排序和篩選
若 user 和 user_stat 表在同一個數據庫下我們可以這樣做:
UserSearch:
public $data; public function rules() {/*{{{*/ return [ ["data"], "integer"], //其他列 ]; }/*}}}*/ public function search($params, $onlyActiveUsers = false) { $query = User::find(); $query->joinWith(["stat"]); $dataProvider = new ActiveDataProvider([ "query" => $query, "sort" => [ "attributes" => [ //其他列 "data" => [ "asc" => [UserStat::tableName() . ".data" => SORT_ASC], "desc" => [UserStat::tableName() . ".data" => SORT_DESC], ], //其他列 ], "defaultOrder" => [ "id" => SORT_DESC, ], ], "pagination" => [ "pageSize" => 50, ], ]); $this->load($params); if (!$this->validate()) { $query->where("0=1"); return $dataProvider; } $query->filterWhere([ //其他列 UserStat::tableName() . ".data" => $this->data ]); return $dataProvider; }
在GridView就可以這樣使用來展示統計數據,就可以排序了
= GridView::widget([ "dataProvider" => $dataProvider, "columns" => [ //其他列 [ "label" => "統計數據", "attribute" => "data", "value" => function($model){ return isset($model->stat->data) ? $model->stat->data : null; } ], //其他列 ], ]); ?>
search 表單中添加以下列就可以篩選了
//其他列 = $form->field($model, "data")?> //其他列然而現實是殘酷的, user 和 user_stat 表并在同一個數據庫下。= Html::submitButton("Search", ["class" => "btn btn-primary"]) ?>
于是就會報出這樣一個錯誤:
SQLSTATE[42S02]: Base table or view not found: 1146 Table "memory.user_stat" doesn"t exist The SQL being executed was: ...
要在兩個數據庫(同一臺服務器)上進行關聯數據查詢,純SQL語句如下:
select a.*,b.* from memory.user as a,memory_stat.user_stat as b where a.id=b.user_id;
Yii2轉化成 SQL 語句時默認不會在表明前添加數據庫名,于是mysql在執行sql語句時就會默認此表在memory數據庫下。
select a.*,b.* from memory.user as a,memory.user_stat as b where a.id=b.user_id;
于是就出現了以上報錯信息。
那么,如何來解決這個問題呢?其實很簡單,只需要重寫 user_stat 的 model 類下的 tableName() 方法就可以了。
// 默認是這樣的 public static function tableName() { return "user_stat"; } public static function getDb() { return Yii::$app->get("dbStat"); }
// 只需要在表明前添加數據庫名 public static function tableName() { return "memory_stat.user_stat"; } public static function getDb() { return Yii::$app->get("dbStat"); }
// 為了提高代碼穩定性,可以這樣寫 public static function tableName() { preg_match("/dbname=([^;]+)/i", static::getDb()->dsn, $matches); return $matches[1].".user_stat"; } public static function getDb() { return Yii::$app->get("dbStat"); }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/22294.html
摘要:前言是特有的用于多表關聯查詢的函數,平時在使用多表關聯查詢的時候建議使用它們。需求分析使用一條查詢語句就能把列表的數據全部展現出來,列表包含一對一,一對多,以及多對多的關系。不能破壞自有的表頭排序功能,以及中的存值。相關資料中多表關聯查詢 前言 hasOne、hasMany是Yii2特有的用于多表關聯查詢的函數,平時在使用多表關聯查詢的時候建議使用它們。為什么?因為這種方式關聯查詢出來...
摘要:前言是特有的用于多表關聯查詢的函數,平時在使用多表關聯查詢的時候建議使用它們。需求分析使用一條查詢語句就能把列表的數據全部展現出來,列表包含一對一,一對多,以及多對多的關系。不能破壞自有的表頭排序功能,以及中的存值。相關資料中多表關聯查詢 前言 hasOne、hasMany是Yii2特有的用于多表關聯查詢的函數,平時在使用多表關聯查詢的時候建議使用它們。為什么?因為這種方式關聯查詢出來...
摘要:前言是特有的用于多表關聯查詢的函數,平時在使用多表關聯查詢的時候建議使用它們。需求分析使用一條查詢語句就能把列表的數據全部展現出來,列表包含一對一,一對多,以及多對多的關系。不能破壞自有的表頭排序功能,以及中的存值。相關資料中多表關聯查詢 前言 hasOne、hasMany是Yii2特有的用于多表關聯查詢的函數,平時在使用多表關聯查詢的時候建議使用它們。為什么?因為這種方式關聯查詢出來...
閱讀 2321·2021-11-24 10:18
閱讀 3385·2021-09-22 15:35
閱讀 3340·2021-09-13 10:37
閱讀 3766·2021-09-06 15:14
閱讀 2071·2021-09-06 15:02
閱讀 2212·2021-09-02 15:11
閱讀 547·2019-08-30 15:53
閱讀 3075·2019-08-29 16:15