thinkphp,thinkOrm同时使用where跟whereOr错误

29 篇文章 2 订阅

keyword:thinkphp where跟whereOr同时使用

前言

判断时间冲突时用whereOr跟where没法实现想要的效果,后面用原生SQL写了,今天突然想到试试闭包查询,遂测试一番果然可行
thinkphp同时使用where和whereOr,本意是两个条件and并列查询,但实际上两个条件之间会用OR连接

错误写法如下

$map1 = [['start_time', '>', $startTime], ['start_time', '<', $endTime]];
        $map2 = [['start_time', '<=', $startTime], ['end_time', '>=',$endTime]];
        $map3 = [['end_time', '>', $startTime], ['end_time', '<', $endTime]];
        $exist = $this
            ->where('id','<>',1)
            ->whereOr([$map1, $map2, $map3])
            ->find();
          
            

生成的SQL

SELECT * FROM `task` WHERE (  `id` <> 1 OR ( `start_time` > 1640566917 AND `start_time` < 1640567917 )  OR ( `start_time` <= 1640566917 AND `end_time` >= 1640567917 )  OR ( `end_time` > 1640566917 AND `end_time` < 1640567917 ) ) AND `task`.`delete_time` = '0' LIMIT 1

解决方法

方法1.
拼原生SQL,用whereRaw查询,如下

$where = "id <> $id";
        $where .= " and ((`start_time` > $startTime AND `start_time` < $endTime) OR (`start_time` <= $startTime AND `end_time` >= $endTime) OR (`end_time` > $startTime AND `end_time` < $endTime))";
        $exist = $this
            ->whereRaw($where)
            ->find();

方法2
使用闭包查询

$exist = $this
            ->where('id','<>',1)
            ->where(function ($query) use($map1, $map2, $map3) {
                $query->whereOr([$map1, $map2, $map3]);
            })
            ->find();

生成的sql如下,条件之间用了and

SELECT * FROM `task` WHERE (  `id` <> 1  AND (  ( `start_time` > 1640566917 AND `start_time` < 1640567917 )  OR ( `start_time` <= 1640566917 AND `end_time` >= 1640567917 )  OR ( `end_time` > 1640566917 AND `end_time` < 1640567917 ) ) ) AND `task`.`delete_time` = '0' LIMIT 1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

flysnownet

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值