Вы можете создать новую область запроса , чтобы создать 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'
];