我正在尝试以下操作:
我有一个函数,仅当它们当前处于打开状态时才返回
/**
* @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(这是“第二天”)之后有一个close_time,因此,如果我使用此功能,即18:00:00,它将不会返回那些酒吧。
>那么,有什么办法可以在我之前写的查询语句中做到这一点(将一天的结束时间设置为另一天)?
if($openingTime>$closingTime)
{
$closingTime = Carbon::now('Europe/Madrid')->setTimeFromTimeString($schedule->closing_time)->addDay(1);
}
非常感谢!
答案 0 :(得分:0)
这里是个主意,您可能想创建一个 MySQL VIEW ,以使事情变得更容易。 当然也不是很准确。这是基于您的问题中给出的一些假设。
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`
这将在创建您的mysql视图后生成一个名为opening_datetime
和closing_datetime
的日期时间,您可以正常进行比较,而无需使用工作日,因为您有2个完整的日期/时间可以进行比较。
UPDATE
您的最终查询应如下所示(保留我在选择中提供的数据)
->having('opening_datetime', '>=', Carbon::now('Europe/Madrid'))
->having('closing_datetime', '<=', Carbon::now('Europe/Madrid'))