yii2 - 讀寫分離模式下強制讀主庫

yii2 配置讀寫自動讀寫分離時,在一些場景下可能須要強制讀主庫。以及 createCommandin 查詢參數綁定實現方法。php

強制讀主庫

yii2 配置讀寫自動主從分離時,在一些場景下可能須要強制讀主庫。這時咱們可使用 \yii\db\ConnectionuseMaster 方法來操做,該方法會將 enableSlaves 模式在本次查詢會話中關閉,查詢完成後繼而恢復。sql

/** @var $users User[] */
$users = User::getDb()->useMaster(function($db) use ($ids) {
    /** @var $db \yii\db\Connection */
    return $db->createCommand("SELECT * FROM " . User::tableName() . " where find_in_set(`id`, :ids) AND `is_del`=:is_del", [
        ':ids' => implode(',', $ids),
        ':is_del' => Base::NOT_DELETED,
    ])->queryAll(\PDO::FETCH_OBJ);
});

createCommand IN 查詢

createCommand 構建 sql 時可能會遇到 IN 查詢的場景,yii2 貌似不支持 IN 的參數綁定,可使用 find_in_set 來代替。固然,你也能夠直接拼接 sql 而不使用 參數綁定yii2

$db->createCommand("SELECT * FROM `users` WHERE `id` in(:ids)", [':ids' => [1, 2, 3]]);
$db->createCommand("SELECT * FROM `users` WHERE `id` in(:ids)", [':ids' => implode(",", [1, 2, 3])]);

會被解析成yii

SELECT * FROM `users` WHERE `id` in(1);
SELECT * FROM `users` WHERE `id` in('1,2,3');//看到 '1,2,3' 果斷換 find_in_set

可行用法code

$db->createCommand("SELECT * FROM `users` WHERE find_in_set(`id`, :ids)", [':ids' => implode(",", [1, 2, 3])]);
相關文章
相關標籤/搜索