Я пытаюсь отфильтровать объекты по дате. Я получаю их:
$events = Event::orderBy('event_date')->with('organizers')->get();
Что работает нормально … но теперь я хотел бы разделить события на пропущенные и не пропущенные, поэтому я попытался с:
$result1 = $events->where('event_date', '<', Carbon::now());
Но он возвращает пустую коллекцию. Если я добавлю get()
, это дает мне ошибку. Как ни странно, если я сделаю это так:
$result1 = $events->where('is_featured', 1);
Это работает и возвращает только избранные элементы. Что я делаю неправильно?
Как вы указали в своем вопросе, $ events — это коллекция, а не запрос. Метод where () в Collection работает немного по-другому.
Для коллекций метод where () не принимает оператор. Это только сравнение равенства. Первый параметр — это ключ, второй — значение, а третий — логическое значение, обозначающее произвольное сравнение (==) и строгое сравнение (===).
То, что вы ищете, это метод filter (). Вы передаете закрытие, которое выполняет сравнение дат. Если Closure возвращает true, элемент остается в коллекции. Если он возвращает false, элемент удаляется из коллекции. Примерно так (просто пример, логику, возможно, нужно настроить):
$filteredEvents = $events->filter(function ($item) use ($date) {
return (data_get($item, 'event_date') > $date) && (data_get($item, 'event_date') < $date->endOfDay());
});
Других решений пока нет …