在where条件内满足条件时设置值

1tuwyuhd  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(373)

我正在尝试以下方法:
我有一个函数,只有当酒吧在当前时刻打开时才返回,

/**
 * @param $pubs
 * @return mixed
 */
public static function isPubCurrentlyOpen($pubs)
{
    $pubs->whereHas('pubSchedules', function ($pubs) {
        $pubs->where('week_day', Carbon::now()->dayOfWeek)
            ->whereRaw(
                "'" . Carbon::now('Europe/Madrid')->format("H:i:s") . "' BETWEEN opening_time AND closing_time"
            );
    } );

    return $pubs;
}

我遇到的问题是,当一些酒吧在00:00之后关门(这将是“第二天”),所以如果我使用这个功能,即18:00:00,它不会返回这些酒吧。
那么,有没有办法在我之前写的查询语句中实现这一点(再设置一天关闭时间)

if($openingTime>$closingTime)
{
  $closingTime = Carbon::now('Europe/Madrid')->setTimeFromTimeString($schedule->closing_time)->addDay(1);
}

谢谢!!

m4pnthwp

m4pnthwp1#

这里的想法,你可能想创建一个mysql视图,使事情更容易为你。当然,这不是很准确;这是基于你的问题中给出的一些假设。

SELECT *,
CONCAT(YEAR(NOW()), '-', MONTH(NOW()), '-', `week_day`, ' ', `opening_time`) AS `opening_datetime`,
IF(`closing_time` < `opening_time`, 
CONCAT(YEAR(NOW()), '-', MONTH(NOW()), '-', `week_day` + 1, ' ', `closing_time`),
CONCAT(YEAR(NOW()), '-', MONTH(NOW()), '-', `week_day`, ' ', `closing_time`)
) AS `closing_datetime`
FROM `pubSchedules`

这将生成一个名为 opening_datetime & closing_datetime 创建mysql视图后,您可以正常比较,而不必使用工作日,因为您将有2个完整的日期/时间进行比较。
更新
您的最终查询应该是这样的(保留我在select中提供的数据)

->having('opening_datetime', '>=', Carbon::now('Europe/Madrid'))
->having('closing_datetime', '<=', Carbon::now('Europe/Madrid'))

相关问题