Yii2實現跨mysql資料庫關聯查詢排序功能

2021-09-17 19:27:51 字數 2204 閱讀 2828

背景:在乙個mysql伺服器上(注意:兩個資料庫必須在同乙個mysql伺服器上)有兩個資料庫:

memory (儲存常規資料表) 中有乙個 user 表(記錄使用者資訊)

memory_stat (儲存統計資料表) 中有乙個 user_stat (記錄使用者統計資料)

public function getstat()

<?= gridview::widget([

'dataprovider' => $dataprovider,

'columns' => [

//其他列

['label' => '統計資料',

'value' => function($model)

],//其他列

],]); ?>

若 user 和 user_stat 表在同乙個資料庫下我們可以這樣做:

public $data;

public function rules()

/*}}}*/

public function search($params, $onlyactiveusers = false)

$query->filterwhere([

//其他列

userstat::tablename() . '.data' => $this->data

]);return $dataprovider;

}

<?= gridview::widget([

'dataprovider' => $dataprovider,

'columns' => [

//其他列

['label' => '統計資料',

'attribute' => 'data',

'value' => function($model)

],//其他列

],]); ?>

<?php $form = activeform::begin(); ?>

//其他列

<?= $form->field($model, 'data')?>

//其他列

<?= html::submitbutton('search', ['class' => 'btn btn-primary']) ?>

<?php activeform::end(); ?>

於是就會報出這樣乙個錯誤:

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;
於是就出現了以上報錯資訊。

那麼,如何來解決這個問題呢?

// 預設是這樣的

public static function tablename()

public static function getdb()

// 只需要在表明前新增資料庫名

public static function tablename()

public static function getdb()

// 為了提高**穩定性,可以這樣寫

public static function tablename()

public static function getdb()

yii2資料庫遷移

yii migrate create create test table 建立乙個資料庫遷移 yii migrate 提交所有的遷移 yii migrate m160623 034801 create test table 指定類名,提交乙個遷移 yii migrate down 還原最近一次遷移 ...

基礎YII2資料庫操作

注意 為了保持精度,從資料庫中取出的資料都被表示為字串,即使相應的資料庫列型別數值。當建立從乙個帶引數的sql乙個db命令,你應該總是使用繫結引數的方法來防止sql注入攻擊。引數繫結是通過預處理語句來實現。除了防止sql注入攻擊,也可通過一次準備sql語句和多次使用不同的引數執行它提高效能 yii ...

yii2 查詢資料庫語法

1 query0 imgroupuser find where gid 56680dfc60b215d62104a4d8 select user client id all ar2 query1 imgroupuser findall gid 56680dfc60b215d62104a4d8 ar3...