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

符合要求


__EOF__

本文作者Blizzard
本文链接https://www.cnblogs.com/obeigong/p/16455308.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   bilzzard  阅读(1191)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示