Laravel 7 множественных предложений where с sortBy

#laravel #eloquent

#laravel #красноречивый

Вопрос:

Может кто-нибудь объяснить, как это сделать с помощью laravel красноречивый? Кажется, я не могу найти решение в Интернете (обратите внимание, что все времена указаны в метке времени Unix):

 $this->model
            ->sortBy('start_datetime') // is unix timestamp
            ->where('start_datetime', '>', now()->startOfWeek()->timestamp)
            ->where('end_datetime', '<', now()->endOfWeek()->timestamp)
            ->get();
  

Это приводит к следующей ошибке:
Call to undefined method AppModelsModel::sortBy()

Я хочу получить datetimes в моей базе данных за текущую неделю, а затем отсортировать ее по тому, какой день наступает первым. Поскольку я использую numbers (временную метку unix) в своей базе данных, я думаю, это не должно быть так сложно.

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

Ответ №1:

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

Попробуйте изменить порядок ваших цепных методов и использовать orderBy() вместо sortBy() :

 $this->model
            ->where('start_datetime', '>', now()->startOfWeek()->timestamp)
            ->where('end_datetime', '<', now()->endOfWeek()->timestamp)
            ->orderBy('start_datetime') // is unix timestamp
            ->get();
  

Дополнение sortBy() против orderBy

sortBy() это метод как для классов Eloquent, так и для поддержки Collection , и его можно рассматривать как некоторый сахар поверх PHP asort() или arsort() .

orderBy() это метод в QueryBuilder классе, который, по сути, добавляет следующее к вашему запросу к базе данных (при использовании SQL)

 ORDER BY `start_datetime`;
  

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

Комментарии:

1. Не могли бы вы пояснить, почему я бы использовал orderBy вместо sortBy ?

2. Конечно. Я обновил свой ответ объяснением sortBy() vs orderBy() . Оба являются жизнеспособными, но я бы посоветовал выполнить ваш заказ в построителе запросов, поскольку это может быть намного эффективнее.

Ответ №2:

Ссылаясь на документы Laravel: Метод sortBy() сортирует коллекцию по заданному ключу. Отсортированная коллекция сохраняет исходные ключи массива, поэтому в этом примере мы будем использовать метод значений для сброса ключей в последовательно пронумерованные индексы.

Итак, вам нужно вызвать sortBy() для коллекции, доставленной через get():

  $data =    $this->model
            ->where('start_datetime', '>', now()->startOfWeek()->timestamp)
            ->where('end_datetime', '<', now()->endOfWeek()->timestamp)
            ->get()->sortBy('start_datetime');