首页 > 解决方案 > 在查询中使用碳时出错

问题描述

我在 mysql 中使用 if 条件时遇到问题

我正在尝试以下操作:

我有两个模型:Pubs 和 Schedules(我在其中静态存储 pubs 时间表)。它们相互关联如下:

酒馆:

/**
 * @return \Illuminate\Database\Eloquent\Relations\HasMany
 */
public function pubSchedules()
{
    return $this->hasMany( Schedule::class );
}

日程:

/**
 * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
 */
public function pub()
{
    return $this->belongsTo(Pub::class);
}

表计划具有以下字段:

编号| pub_id | 工作日 | 开放时间 | 关闭时间

我正在开发一个过滤器,只显示当前打开的酒吧。

我制作的第一个功能完美运行:

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

                    "
            );
    } );
 }

它返回一个可以与其他过滤器连接的查询。

问题是当我有一个具有这种时间表的酒吧时:同一天的 09:00 - 03:00。当然 03:00 是在第二天,但我们选择这种可能性是为了让客户更容易存储时间表。

好吧,在这个例子中,它使得 "Carbon::now('Europe/Madrid')->format("H:i:s")" 不在 opening_time 和 closing_time 之间,所以这个 pub 它不会显示为打开(几时)。

在 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 tappear_borrador.schedules
;

当它大于 00:00 时,它可以完美地将“多一天”设置为 close_time,但是我在我的函数中设置它时遇到问题:

$pubs->whereHas('pubSchedules', function ($pubs) {
        $pubs->where('week_day', Carbon::now()->dayOfWeek)
            ->whereRaw(
                "'" . Carbon::now('Europe/Madrid')->format('Y-m-d H:i:s') .
                "' BETWEEN CONCAT(YEAR(NOW()), '-', MONTH(NOW()), '-', ".Carbon::now()->dayOfWeek.", ' ', opening_time)
                    AND IF(closing_time < opening_time,
                            CONCAT(YEAR(NOW()), '-', MONTH(NOW()), '-', ".Carbon::now()->dayOfWeek." + 1, ' ', closing_time),
                            CONCAT(YEAR(NOW()), '-', MONTH(NOW()), '-', ".Carbon::now()->dayOfWeek.", ' ', closing_time)
                    ) 

                    "
            );
    } );

这我让它没有返回任何东西(也有任何错误)。(((我还检查了 json_die(Carbon::now()->dayOfWeek+1) 没有返回一个更多的值到当天......这可能是问题之一吗?)),

检查更改的当前时刻以将年/月/h:i:s 与打开和关闭时间进行比较。

所以朋友们:我需要你的帮助来改进我的最后一个代码,如果关闭时间<打开时间,关闭时间将在第二天,然后比较当前时刻是否在之间。

有任何想法吗?非常感谢

标签: mysqllaravelormeloquent

解决方案


推荐阅读