Мой магазин в настоящее время открыт?используя углерод - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь сделать следующее:

У меня есть две модели: Pub и Schedule, в которых хранятся разные графики данного паба.По этой причине соотношение между этими двумя моделями составляет 1 паб-> N расписаний:

Паб:

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

Таблица «расписания»имеет следующие поля:

id | pub_id | week_day | creation_time | закрытия_time

Например, для pub с id = 303 у нас есть следующее расписание

id |pub_id | week_day | Время открытия | Время закрытия '9', '303', '5', '00: 00: 00 ', '02: 30: 00' '10', '303', '5', '10: 30: 00 ', '13: 30: 00' '11', '303', '5', '20: 00: 00 ', '23: 59: 00'

Я пытаюсь сделатьфункция, позволяющая узнать, открыт ли данный паб в настоящее время или нет, но, поскольку я не очень много знаю об Carbon, у меня возникли некоторые проблемы, чтобы выяснить.

Я хотел бы знать, как я могу сравнить текущее время с различными временами открытия и закрытия данного паба в течение дня, и узнать, находится ли текущее время внутри интервала времени паба или нетopen.

Я пробовал это (я хочу, чтобы функция возвращала сообщение «открыто / закрыто»):

(грубая версия)

public function isPubCurrentlyOpen(Pub $pub)
{
    $dayOfWeek = Carbon::now()->dayOfWeek;

    $schedules = Schedule::where([
        ['pub_id', $pub->id ],
        ['week_day', $dayOfWeek],
    ])->get();

    foreach($schedules as $schedule)
    {
        if(var_dump($dayOfWeek->between($schedule->opening_time, $schedule->closing_time))){
            return "Open";
        }

    }
}

Пожалуйста, не могли бы вы помочь мне?Спасибо !!

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Решение (спасибо jedrzej.kurylo и Thomas Moors):

public function isPubCurrentlyOpen(Pub $pub)
{
    $dayOfWeek = Carbon::now()->dayOfWeek;

    $schedules = Schedule::where([
        ['pub_id', $pub->id ],
        ['week_day', $dayOfWeek],
    ])->get();

    foreach ($schedules as $schedule){
        $isOpen[] =
            Carbon::now()->between(
                Carbon::now()->setTimeFromTimeString($schedule->opening_time),
                Carbon::now()->setTimeFromTimeString($schedule->closing_time)
            );
    }

    if(in_array(true, $isOpen)){
        return "Pub Opened";
    }

    return "Pub Closed";
}
0 голосов
/ 08 июня 2018

Следующие действия должны помочь:

$isOpen = 
    // check if day of week matches
    Carbon::now()->dayOfWeek === $schedule->week_day &&
    // check if current time is greater than or equal than today's opening time
    Carbon::now()->gte(Carbon::now()->setTimeFromTimeString($schedule->opening_time)) &&
    // check if current time is less than or equal than today's closing time
    Carbon::now()->lte(Carbon::now()->setTimeFromTimeString($schedule->closing_time));

ОБНОВЛЕНИЕ: , как предложено Томасом ниже, вы можете упростить код, используя метод между :

$isOpen = 
    Carbon::now()->dayOfWeek === $schedule->week_day &&
    Carbon::now()->between(
      Carbon::now()->setTimeFromTimeString($schedule->opening_time),
      Carbon::now()->setTimeFromTimeString($schedule->closing_time)
    );
...