搜索
系统检测到您的用户名不符合规范:

tp5 复杂sql查询问题

浏览:3437 发布日期:2020年01月07日 分类:ThinkPHP5专区 关键字: 时间区间包含交叉查询 sql 查询 多条件
刚写那么多提示发表成功居然被吃了,。。。。伤心。。。
先说说场景:后台多条件查询,其中一个是时间段也就是说要根据开始时间和结束时间筛选,至于筛选什么呢?活动时间(也是一个时间段)。比如有几个活动
活动一,2020年01月02日至2020年01月08日
活动二,2020年01月04日至2020年01月15日
活动三,2020年01月01日至2020年01月20日

我现在搜索 2020年01月19日至2020年01月29日 按理 搜出 活动三
我现在搜索 2020年01月01日至2020年01月03日 按理 搜出 活动一
也就是搜出所有与选择时间有包含或交叉的活动

刚开始这样写的
$q=array(
['validity_begin','between',[$start_time, $end_time]],
['validity_end','between',[$start_time, $end_time]]
);
$BannerModel= $BannerModel->where(function($query) use ($q){
$query->whereOr($q);
})

刚开始试了下 搞定
后来仔细一看不对啊
当我搜索 2020年01月05日至2020年01月06日 按理全部搜出 但一条也没有
后来用原生sql试着写了下
$BannerModel= $BannerModel->where('`validity_begin` BETWEEN '.$start_time.' AND '.$end_time.' OR `validity_end` BETWEEN '.$start_time.' AND '.$end_time.' OR '.$start_time.' Between `validity_begin` AND `validity_end` OR '.$end_time.' BETWEEN `validity_begin` AND `validity_end`');
完美 全部正确数据。

于是试着用tp5的查询写
$q=array(
['validity_begin','between',[$start_time, $end_time]],
['validity_end','between',[$start_time, $end_time]],
[$start_time,'between',['validity_begin','validity_end']],
[$end_time,'between',['validity_begin','validity_end']]
);
$BannerModel= $BannerModel->where(function($query) use ($q){
$query->whereOr($q);
});
sql报错了。。。。。试了好多写法都没成功。
不知是小弟孤陋寡闻,还是必须得原生sql语句写。望各位见多识广的大神指点一二。。。

研究了下这样写
$q=array(
['validity_begin','between',[$start_time, $end_time]],
['validity_end','between',[$start_time, $end_time]],
["$start_time",'between',[Db::raw('validity_begin'),Db::raw('validity_end')]],
["$end_time",'between',[Db::raw('validity_begin'),Db::raw('validity_end')]]
);
$BannerModel= $BannerModel->where(function($query) use ($q){
$query->whereOr($q);
});
日志打印:SELECT * FROM `banner` WHERE ( `validity_begin` BETWEEN 1579190400 AND 1579276799 OR `validity_end` BETWEEN 1579190400 AND 1579276799 OR 1579190400 BETWEEN validity_begin AND validity_end OR 1579276799 BETWEEN validity_begin AND validity_end ) AND `is_deleted` = 0 AND `is_deleted` = 0 ORDER BY `id` DESC LIMIT 0,10 复制直接去数据库查正常 在TP中不出数据。难道是 `validity_begin` 与validity_begin 区别导致在tp中出不来,数据库直接查没问题??
最佳答案
评论() 相关
后面还有条评论,
评论支持使用[code][/code]标签添加代码
您需要登录后才可以评论 登录 | 立即注册
收藏
tk617070321
积分:1394 等级:LV3
热点推荐
(追記) (追記ここまで)
最新更新

我们

合作

网站

信息

ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多的原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进,已经成长为国内最领先和最具影响力的WEB应用开发框架,众多的典型案例确保可以稳定用于商业以及门户级的开发。

AltStyle によって変換されたページ (->オリジナル) /