php - Laravel如何从现在工作的数据库中获取餐馆?
问题描述
我需要实现一个功能,允许餐厅经理为其餐厅设置营业时间。所以我有Restaurant
模型(对于这种情况,只有 ID)。
我还创建了RestaurantOpeningHour
包含餐厅数据的模型:
class RestaurantOpeningHour extends Model
{
protected $fillable = [
'restaurant_id',
'pickup_type_id',
'week_day',
'from_date',
'until_date',
'from_hour',
'until_hour',
'is_closed'
];
public function restaurant()
{
return $this->belongsTo(Restaurant::class);
}
public function pickupType()
{
return $this->belongsTo(PickupType::class);
}
}
业务需要一个功能,其中餐厅具有“默认”营业时间和自定义营业时间,这只会影响日期的音调。因此,一周中的每一天在数据库中都有自己的行,但 1 天可以有 2 行:“默认”行和“自定义”行。自定义行的优先级高于“默认”行。
- 默认行表示
from_date
和until_date
等于NULL
。 - 自定义行意味着该行在两个日期
from_date
和until_date
.
我的目标是使用 eloquent 范围找到现在以雄辩方式开业的餐厅。所以我需要scopeOpenNow()
在模型中创建一个范围Restaurant
,它将实现以下逻辑:
where day = current_day
where from_date IS NULL and until_date IS NULL
和where from_date >= NOW() AND until_date <= NOW()
ORDER BY (from_date IS NOT NULL, until_date IS NOT NULL) DESC
where from_hour <= NOW() AND until_hour > NOW()
LIMIT 1
因为如果一天会有默认行和自定义行,那么我们只需要自定义行并检查营业时间。
现在我坚持关于LIMIT 1
. 我不明白如何创建一个范围来实现上面列表中的所有项目。
我将不胜感激任何帮助 :)
解决方案
我仍然不确定我是否完全理解,如果您可以提供一些示例数据来使用会更好。
这应该让你开始: -
<?php
namespace App;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;
class Restaurant extends Model
{
public function scopeOpenNow($query)
{
$now = Carbon::now();
$dayOfTheWeek = Carbon::now()->dayOfWeek;
return $query->where(['day', '=', $dayOfTheWeek],
['from_date', '>=', $now], ['from_hour', '<=' , $now],
['until_date', '<=', $now], ['until_hour', '>',$now])
->orWhereNull('from_date')
->orderBy('from_date', 'ASC')
->take(1)
->get();
}
}
推荐阅读
- linux - 从bash(循环)中的文件内容设置变量
- android - 检测安装在真实设备中的 Android 应用程序?
- rest - Keycloak 管理员用户创建
- node.js - 如何仅捕获用户修改的字段
- doctrine-orm - 添加项目时如何检查记录是否存在的学说
- arangodb - Arangodb 使用 Java API:创建图形时是否需要定义所有边?
- ssh - 在 Cygwin 上运行 Ansible sudo(“以 root 身份”)
- excel - EXCEL 或 CALC 问题:如何设置单元格中的最大字符数并在达到最大字符数时自动跳过 2 行?
- javascript - 在哪里可以定义函数
- node.js - FFMPEG 只做一次 HTTP 范围请求(HTML5 MediaStream/WebM)