如果条件在where条件内满足,则设置值

时间:2018-06-20 14:52:00

标签: mysql laravel if-statement eloquent

我正在尝试以下操作:

我有一个函数,仅当它们当前处于打开状态时才返回

/**
 * @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);
} 

非常感谢!

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_datetimeclosing_datetime的日期时间,您可以正常进行比较,而无需使用工作日,因为您有2个完整的日期/时间可以进行比较。

UPDATE

您的最终查询应如下所示(保留我在选择中提供的数据)

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