摘要:于是就會(huì)報(bào)出這樣一個(gè)錯(cuò)誤要在兩個(gè)數(shù)據(jù)庫同一臺(tái)服務(wù)器上進(jìn)行關(guān)聯(lián)數(shù)據(jù)查詢,純語句如下轉(zhuǎn)化成語句時(shí)默認(rèn)不會(huì)在表明前添加數(shù)據(jù)庫名,于是在執(zhí)行語句時(shí)就會(huì)默認(rèn)此表在數(shù)據(jù)庫下。默認(rèn)是這樣的只需要在表明前添加數(shù)據(jù)庫名為了提高代碼穩(wěn)定性,可以這樣寫
現(xiàn)在在 user 表生成的 GridView 列表中展示 user_stat 中的統(tǒng)計(jì)數(shù)據(jù)背景:在一個(gè)mysql服務(wù)器上(注意:兩個(gè)數(shù)據(jù)庫必須在同一個(gè)mysql服務(wù)器上)有兩個(gè)數(shù)據(jù)庫:
memory (存儲(chǔ)常規(guī)數(shù)據(jù)表) 中有一個(gè) user 表(記錄用戶信息)
memory_stat (存儲(chǔ)統(tǒng)計(jì)數(shù)據(jù)表) 中有一個(gè) user_stat (記錄用戶統(tǒng)計(jì)數(shù)據(jù))
只需要在User的model類中添加關(guān)聯(lián)
public function getStat() { return $this->hasOne(UserStat::className(), ["user_id" => "id"]); }
在GridView就可以這樣使用來展示統(tǒng)計(jì)數(shù)據(jù)
= GridView::widget([ "dataProvider" => $dataProvider, "columns" => [ //其他列 [ "label" => "統(tǒng)計(jì)數(shù)據(jù)", "value" => function($model){ return isset($model->stat->data) ? $model->stat->data : null; } ], //其他列 ], ]); ?>現(xiàn)在增加了一個(gè)需求,需要在user GridView 列表中對(duì)統(tǒng)計(jì)數(shù)據(jù)進(jìn)行排序和篩選
若 user 和 user_stat 表在同一個(gè)數(shù)據(jù)庫下我們可以這樣做:
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就可以這樣使用來展示統(tǒng)計(jì)數(shù)據(jù),就可以排序了
= GridView::widget([ "dataProvider" => $dataProvider, "columns" => [ //其他列 [ "label" => "統(tǒng)計(jì)數(shù)據(jù)", "attribute" => "data", "value" => function($model){ return isset($model->stat->data) ? $model->stat->data : null; } ], //其他列 ], ]); ?>
search 表單中添加以下列就可以篩選了
//其他列 = $form->field($model, "data")?> //其他列然而現(xiàn)實(shí)是殘酷的, user 和 user_stat 表并在同一個(gè)數(shù)據(jù)庫下。= Html::submitButton("Search", ["class" => "btn btn-primary"]) ?>
于是就會(huì)報(bào)出這樣一個(gè)錯(cuò)誤:
SQLSTATE[42S02]: Base table or view not found: 1146 Table "memory.user_stat" doesn"t exist The SQL being executed was: ...
要在兩個(gè)數(shù)據(jù)庫(同一臺(tái)服務(wù)器)上進(jìn)行關(guān)聯(lián)數(shù)據(jù)查詢,純SQL語句如下:
select a.*,b.* from memory.user as a,memory_stat.user_stat as b where a.id=b.user_id;
Yii2轉(zhuǎn)化成 SQL 語句時(shí)默認(rèn)不會(huì)在表明前添加數(shù)據(jù)庫名,于是mysql在執(zhí)行sql語句時(shí)就會(huì)默認(rèn)此表在memory數(shù)據(jù)庫下。
select a.*,b.* from memory.user as a,memory.user_stat as b where a.id=b.user_id;
于是就出現(xiàn)了以上報(bào)錯(cuò)信息。
那么,如何來解決這個(gè)問題呢?其實(shí)很簡(jiǎn)單,只需要重寫 user_stat 的 model 類下的 tableName() 方法就可以了。
// 默認(rèn)是這樣的 public static function tableName() { return "user_stat"; } public static function getDb() { return Yii::$app->get("dbStat"); }
// 只需要在表明前添加數(shù)據(jù)庫名 public static function tableName() { return "memory_stat.user_stat"; } public static function getDb() { return Yii::$app->get("dbStat"); }
// 為了提高代碼穩(wěn)定性,可以這樣寫 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"); }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/22294.html
摘要:前言是特有的用于多表關(guān)聯(lián)查詢的函數(shù),平時(shí)在使用多表關(guān)聯(lián)查詢的時(shí)候建議使用它們。需求分析使用一條查詢語句就能把列表的數(shù)據(jù)全部展現(xiàn)出來,列表包含一對(duì)一,一對(duì)多,以及多對(duì)多的關(guān)系。不能破壞自有的表頭排序功能,以及中的存值。相關(guān)資料中多表關(guān)聯(lián)查詢 前言 hasOne、hasMany是Yii2特有的用于多表關(guān)聯(lián)查詢的函數(shù),平時(shí)在使用多表關(guān)聯(lián)查詢的時(shí)候建議使用它們。為什么?因?yàn)檫@種方式關(guān)聯(lián)查詢出來...
摘要:前言是特有的用于多表關(guān)聯(lián)查詢的函數(shù),平時(shí)在使用多表關(guān)聯(lián)查詢的時(shí)候建議使用它們。需求分析使用一條查詢語句就能把列表的數(shù)據(jù)全部展現(xiàn)出來,列表包含一對(duì)一,一對(duì)多,以及多對(duì)多的關(guān)系。不能破壞自有的表頭排序功能,以及中的存值。相關(guān)資料中多表關(guān)聯(lián)查詢 前言 hasOne、hasMany是Yii2特有的用于多表關(guān)聯(lián)查詢的函數(shù),平時(shí)在使用多表關(guān)聯(lián)查詢的時(shí)候建議使用它們。為什么?因?yàn)檫@種方式關(guān)聯(lián)查詢出來...
摘要:前言是特有的用于多表關(guān)聯(lián)查詢的函數(shù),平時(shí)在使用多表關(guān)聯(lián)查詢的時(shí)候建議使用它們。需求分析使用一條查詢語句就能把列表的數(shù)據(jù)全部展現(xiàn)出來,列表包含一對(duì)一,一對(duì)多,以及多對(duì)多的關(guān)系。不能破壞自有的表頭排序功能,以及中的存值。相關(guān)資料中多表關(guān)聯(lián)查詢 前言 hasOne、hasMany是Yii2特有的用于多表關(guān)聯(lián)查詢的函數(shù),平時(shí)在使用多表關(guān)聯(lián)查詢的時(shí)候建議使用它們。為什么?因?yàn)檫@種方式關(guān)聯(lián)查詢出來...
閱讀 2332·2021-11-24 10:18
閱讀 3414·2021-09-22 15:35
閱讀 3357·2021-09-13 10:37
閱讀 3778·2021-09-06 15:14
閱讀 2082·2021-09-06 15:02
閱讀 2227·2021-09-02 15:11
閱讀 559·2019-08-30 15:53
閱讀 3084·2019-08-29 16:15