Laravel Query: получить модели, где дочерние диапазоны дат не входят в массив диапазонов дат - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть Event модель, которая hasMany childs Time модели.Time - это диапазон времени и даты, в котором есть поля start_time и end_time.

Как получить все Events, где ни один из дочерних элементов Times не пересекается с array диапазонами дат?

Пример:

$events = Event::notInDateRange([
    [ 'start_date' => '2000.01.01 00:00:00', 'end_date' => '2000.01.01 12:00:00' ],
    [ 'start_date' => '2000.01.02 12:00:00', 'end_date' => '2000.01.02 16:00:00' ],
    [ 'start_date' => '2000.01.03 10:00:00', 'end_date' => '2000.01.03 12:30:00' ],
])->get();
// In this case I don't want to get Event where one of Time is 
// [ 'start_date' => '2000.01.03 12:00:00' => 'end_date' => '2000.01.03 14:00:00' ]

1 Ответ

0 голосов
/ 18 декабря 2018

Вы можете создать новую область запроса , чтобы создать notInDateRange область в вашей модели Event и использовать whereNotBetween where внутри новой области.

Внутри вашего Event класса модели определите новую функцию с именем scopeNotInDateRange, которая принимает дату начала и окончания, и определите ее следующим образом:

public function scopeNotInDateRange($query, $start_date, $end_date)
    $start = new Carbon($start_date);
    $end = new Carbon($end_date);
    return $query->whereNotBetween('start_date', [$start, $end])
                 ->whereNotBetween('end_date', [$start, $end]);

Также не забудьте добавить use Carbon\Carbon; вверх вашего Event класса.Мы будем использовать Carbon для преобразования строк в даты.

Затем вы можете использовать новую область запроса, например App\Event::notInDateRange($start, $end).Вы также можете связать области видимости, поэтому в вашем примере вы можете использовать:

$events = Event::notInDateRange('2000-01-01 00:00:00', '2000-01-01 12:00:00')
               ->notInDateRange('2000-01-02 12:00:00', '2000-01-02 16:00:00')
               ->notInDateRange('2000-01-03 10:00:00', '2000-01-03 12:30:00')
               ->get();

Обратите внимание, что я также изменил ., которые вы использовали в ваших датах, на -, чтобы Carbon былвозможность конвертировать строки в даты.

Если вы еще этого не сделали, также убедитесь, что ваши столбцы start_date и end_date конвертированы в углеродные даты, используя Mutators даты при использованииполучить доступ к их значениям в Laravel.Для этого добавьте следующий фрагмент в класс Event модели:

/**
 * The attributes that should be mutated to dates.
 *
 * @var array
 */
protected $dates = [
    'start_date', 'end_date'
];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...