yii2
配置读写自动读写分离时,在一些场景下可能须要强制读主库。以及 createCommand
的 in
查询参数绑定实现方法。php
yii2
配置读写自动主从分离时,在一些场景下可能须要强制读主库。这时咱们可使用 \yii\db\Connection
的 useMaster
方法来操做,该方法会将 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
构建 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])]);