Как сделать запрос в отношении «один ко многим» с условием «где» в родительских и дочерних полях - PullRequest
1 голос
/ 04 мая 2020

Родительская таблица - Файл миграции

Schema::create('schedules', function (Blueprint $table) {
    $table->id();
    $table->foreignId('location_id')->nullable();
    $table->foreignId('service_id')->nullable();
    $table->foreignId('user_id')->nullable();
    $table->timestamp('start_date');
    $table->timestamp('end_date')->nullable();
    $table->foreignId('created_by_user_id');
    $table->timestamps();
});

Дочерняя вкладка - Файл миграции

Schema::create('schedule_day_times', function (Blueprint $table) {
    $table->id();
    $table->foreignId('schedule_id');
    $table->unsignedTinyInteger('day_name')->nullable();
    $table->time('start_time');
    $table->time('end_time')->nullable();
    $table->timestamps();
});

Отношения в родительском расписании. php

public function dayTimes()
{
    return $this->hasMany('App\ScheduleDayTime');
}

Что наилучший способ написать запрос для условия ниже?

//$appointment_at = Carbon::tomorrow()->addHours(8);
Query where appointment_at is between start_date and end_date and start_time and end_time.

1 Ответ

0 голосов
/ 05 мая 2020

Вы также можете сделать ->whereHas на dayTimes примерно так:

Schedule::whereHas('dayTimes', function (Builder $query) use ($appointment_at) {
            $query->where('start_time', '<=', $appointment_at)
                ->where('end_time', '>=', $appointment_at);
        })
            ->whereDate('start_date', '<=', $appointment_at->timestamp)
            ->whereDate('end_date', '>=', $appointment_at->timestamp)
            ->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...