成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Yii2實(shí)現(xiàn)跨mysql數(shù)據(jù)庫關(guān)聯(lián)查詢排序功能

lx1036 / 1193人閱讀

摘要:于是就會(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)定性,可以這樣寫

背景:在一個(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ù))

現(xiàn)在在 user 表生成的 GridView 列表中展示 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ù)

 $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ù),就可以排序了

 $dataProvider,
    "columns" => [

        //其他列
        
        [
            "label" => "統(tǒng)計(jì)數(shù)據(jù)",
            "attribute" => "data",
            "value" => function($model){
                return isset($model->stat->data) ? $model->stat->data : null;
            }
        ],
        
        //其他列
    ],
]); ?>

search 表單中添加以下列就可以篩選了


//其他列 

field($model, "data")?>

//其他列
"btn btn-primary"]) ?>
然而現(xiàn)實(shí)是殘酷的, user 和 user_stat 表并在同一個(gè)數(shù)據(jù)庫下。

于是就會(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)文章

  • Yii2中hasOne、hasMany以及多對(duì)多關(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)查詢出來...

    qc1iu 評(píng)論0 收藏0
  • Yii2中hasOne、hasMany以及多對(duì)多關(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)查詢出來...

    lmxdawn 評(píng)論0 收藏0
  • Yii2中hasOne、hasMany以及多對(duì)多關(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)查詢出來...

    BDEEFE 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<