yii2 配置读写自动读写分离时,在一些场景下可能需要强制读主库。以及 createCommandin 查询参数绑定实现方法。

强制读主库

yii2 配置读写自动主从分离时,在一些场景下可能需要强制读主库。这时我们可以使用 \yii\db\ConnectionuseMaster 方法来操作,该方法会将 enableSlaves 模式在本次查询会话中关闭,查询完成后继而恢复。

/** @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 而不使用 参数绑定

$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])]);

会被解析成

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

可行用法

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

big_cat
1.7k 声望130 粉丝

规范至上


引用和评论

0 条评论