Сравнение дат сбора Laravel

Итак, я часами искал ответ, но, похоже, не нашел его. У меня есть массив "заказов" на разные даты. Я получаю все заказы на эту неделю, это не должно быть проблемой, тогда я хочу вкладку для каждого дня недели.

То, что я пробовал до сих пор, это:

$dinnerOrders->where('date','>',$date)->where('date','<', $date->endOfDay())->sortBy('created_at');

Где $дата:

$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.

Итак, я спрашиваю, возможно, вы можете сравнить дату коллекции? Если да, то как?


person Oskar Jedvert    schedule 19.11.2015    source источник
comment
Возможно, вы неправильно строите весь запрос и публикуете только часть, которая выглядит нормально. Таким образом, вместо использования get() для получения результатов используйте toSql(), и это вернет строку с SQL-запросом, который создается и выполняется Query Builder. Соответствует ли это тому, что вы запускаете вручную?   -  person Bogdan    schedule 19.11.2015
comment
Я бы проверил, какой запрос выполняется. Поместите этот код после выполнения запроса и проверьте выполнение SQL-запроса: dd(DB::getQueryLog()) (для использования БД вы должны импортировать его: используйте Illuminate\Support\Facades\DB;)   -  person gandra404    schedule 19.11.2015
comment
@Bogdan toSql() не работает, поскольку $dinnerOrders - это коллекция, которая уже была получена sql, извините, должно было быть более ясно. Обновили исходный вопрос.   -  person Oskar Jedvert    schedule 19.11.2015
comment
Моя ошибка, вам было ясно, что это сборник из исходного вопроса, я просто пропустил этот факт.   -  person Bogdan    schedule 19.11.2015


Ответы (1)


Примечание. Этот ответ относится к Laravel ‹= 5.2. Laravel 5.3 обновил метод where() в Collection, чтобы он соответствовал построителю запросов, поэтому теперь он принимает оператор.


Как вы указываете в своем вопросе, $dinnerOrders - это коллекция, а не запрос. Метод where() на Collection работает немного по-другому.

Для коллекций метод where() не принимает оператор. Он делает только сравнения равенства. Первый параметр — это ключ, второй — значение, а третий — логическое значение, указывающее на свободное сравнение (==) и строгое сравнение (===).

Вам нужен метод filter(). Вы передаете Closure, который выполняет сравнение дат. Если Closure возвращает true, элемент остается в коллекции. Если он возвращает false, элемент удаляется из коллекции. Что-то вроде этого (просто пример, логика может нуждаться в настройке):

$dinnerOrders = $dinnerOrders->filter(function ($item) use ($date) {
    return (data_get($item, 'date') > $date) && (data_get($item, 'date') < $date->endOfDay());
});

Опубликовать вопрос Править

Основываясь на коде, указанном в вашем редактировании, я предполагаю, что в ресторане много обедов, а на ужин много заказов. Если это верно, вы можете установить связь, утверждающую, что в ресторане много заказов на ужины:

Ресторан.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();
person patricus    schedule 19.11.2015
comment
Благодарю вас! Это сработало отлично, единственная проблема заключалась в том, что моя $date по какой-то причине была в конце дня, поэтому я просто переключаю $date в функции на $date->startOfDay() - person Oskar Jedvert; 19.11.2015
comment
@user3032753 user3032753 Да, я не проверял все, что касается сравнения углерода, поэтому я подумал, что вам, возможно, придется немного изменить код, но я хотел донести идею. Я рад, что это помогло. - person patricus; 19.11.2015