其他分享
首页 > 其他分享> > Tp5 where 中包含or 链式查询怎么写

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