yii2
配置读写自动读写分离时,在一些场景下可能需要强制读主库。以及 createCommand
的 in
查询参数绑定实现方法。
强制读主库
yii2
配置读写自动主从分离时,在一些场景下可能需要强制读主库。这时我们可以使用 \yii\db\Connection
的 useMaster
方法来操作,该方法会将 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])]);
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。