Хорошо, поэтому я искал несколько часов для ответа, но не могу найти его. У меня есть множество «заказов» для разных дат. Я получаю все заказы на эту неделю, это не должно быть проблемой, затем я хочу сделать вкладку для каждого дня недели.
То, что я пробовал до сих пор, заключается в следующем:
$dinnerOrders->where('date','>',$date)->where('date','<', $date->endOfDay())->sortBy('created_at');
Где $ date:
$dt = Carbon\Carbon::create()->startOfWeek(); Carbon\Carbon::setTestNow($dt); $date = new Carbon\Carbon('this ' . $day);
И $ dinnerOrders проходят мимо:
$dinnerOrders = collect([]); foreach($restaurant->dinners as $dinner) { foreach($dinner->orders as $order) { $dinnerOrders[$order->id] = $order; } }
Даты кажутся правильными, и это слова в sql. Это не работает, потому что $ dinnerOrders – это коллекция?
То, что я получаю, ничто, т. Е. Пустой набор, несмотря на то, что он работает в терминале mysql.
Так что, возможно, вы спрашиваете, можете ли вы провести сравнение даты в коллекции? Если да, то как?
Как вы заявляете в своем вопросе, $dinnerOrders
– это коллекция, а не запрос. Метод where()
в Collection
работает несколько иначе.
Метод Collections для метода Collections where()
не принимает оператора. Это только сравнение равенства. Первым параметром является ключ, второй – это значение, а третий – логическое значение для обозначения свободного сравнения (==) против строгого сравнения (===).
То, что вы ищете, это метод filter()
. Вы проходите Закрытие, которое сравнивает дату. Если Closure возвращает true, элемент остается в коллекции. Если он возвращает false, элемент будет удален из коллекции. Что-то вроде этого (просто пример, логика, возможно, потребуется изменить):
$dinnerOrders = $dinnerOrders->filter(function ($item) use ($date) { return (data_get($item, 'date') > $date) && (data_get($item, 'date') < $date->endOfDay()); });
Основываясь на коде, предоставленном в вашем редактировании, я предполагаю, что в ресторане есть много обедов, а ужин имеет множество заказов. Если это правильно, вы можете установить отношения, в которых говорится, что в ресторане есть много заказов через обеды:
Restaurant.php:
public function orders() { // restaurant has many orders through dinners $this->hasManyThrough('App\Order', 'App\Dinner'); }
С помощью этой настройки отношений вы можете получить свою информацию с помощью построителя запросов:
$dinnerOrders = $restaurant->orders()->where('date','>',$date)->where('date','<', $date->endOfDay())->get();