Tp5 where 中包含or 链式查询怎么写
作者:互联网
问题
当查询中有需要用到or,你可能是按照如下的写法
$where = ['user_id' => $user_id];
$whereor = ['uc.level' => 3,'u.account_type' => 2];
UserModel::alias('u')
->join(UserCheckLevelModel::tableName('uc'), 'u.id=uc.user_id', 'left')
->where($where)
->whereOr($whereor)
->find();
这种写法最后生成的语句是这样的
SELECT * FROM `user` `u` LEFT JOIN .user_check_level `uc` ON `u`.`id`=`uc`.`user_id` WHERE `user_id` = 1 OR `uc`.`level` = 3 OR `u`.`account_type` = 2 LIMIT 1
显然,这个语句不是所期望的,期望的应该是下面这样的语句,or的条件价格括号包起来作为一个整体
SELECT * FROM `user` `u` LEFT JOIN user_check_level `uc` ON `u`.`id` = `uc`.`user_id` WHERE `u`.`id` = 123 OR ( `uc`.`level` = 3 AND `u`.`account_type` = 2 ) LIMIT 1
那么我们改如何操作才能得到正确的sql呢?
解决
使用tp5内置的方法,匿名函数即刻满足要求
$where = ['u.id'=>$user_id];
$whereOr = ['uc.level' => 3,'u.account_type' => 2];
$user_id = 123;
$a = UserModel::alias('u')
->join(UserCheckLevelModel::tableName('uc'), 'u.id=uc.user_id', 'left')
->where($where)
->whereOr(function($query) use ($whereOr){
$query->where($whereOr);
})->find();
生成的语句是
SELECT * FROM `user` `u` LEFT JOIN user_check_level `uc` ON `u`.`id` = `uc`.`user_id` WHERE `u`.`id` = 123 OR ( `uc`.`level` = 3 AND `u`.`account_type` = 2 ) LIMIT 1
符合要求
标签:level,Tp5,user,链式,whereOr,where,id,uc 来源: https://www.cnblogs.com/obeigong/p/16455308.html