【问题标题】:Setting a value if a condition is fulfilled inside a where condition如果在 where 条件中满足条件,则设置一个值
【发布时间】:2018-11-29 18:11:45
【问题描述】:

我正在尝试以下方法:

我有一个函数,只有当它们在当前时刻打开时才返回 pubs,

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

非常感谢!!

【问题讨论】:

  • 提供表结构,如果您的 opening_time 和 closing_time 不包含完整的日期/时间,那么您做错了
  • 如果您的数据不是每天更新(这意味着您正在存储静态数据),那么它会很好......您只需使用两个时间之间的差异来弥补两个日期,例如:工作时间 -> 转换为日期 -> 比较
  • id| pub_id |工作日 |开放时间 |关闭时间,例如当 week_day = 3、opening_time = 09:00、closeing_time = 03:30 时遇到问题
  • 是静态数据@ahmad...你能给我一个你所说的qhat的例子吗?谢谢兄弟!

标签: mysql laravel if-statement eloquent


【解决方案1】:

这里的想法是,您可能想要创建一个 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 个完整的日期/时间进行比较。

更新

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

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

【讨论】:

  • 非常感谢!!我认为这是找到解决方案的一个很好的起点......我会发布它(希望很快)非常感谢 Ahmad
  • 艾哈迈德,如果你能在这里帮助我(更好地解释)谢谢! stackoverflow.com/questions/50968390/…
  • 如果您不打算创建视图,那么您必须将它们保留在您的 select 语句中,并将您的 where 替换为 have ...忘记 where 语句中的 week_day 并使用完整的搜索正确答案的日期/时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多