先说说场景:后台多条件查询,其中一个是时间段也就是说要根据开始时间和结束时间筛选,至于筛选什么呢?活动时间(也是一个时间段)。比如有几个活动
活动一,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中出不来,数据库直接查没问题??
最佳答案