#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()
vsorderBy()
. Оба являются жизнеспособными, но я бы посоветовал выполнить ваш заказ в построителе запросов, поскольку это может быть намного эффективнее.
Ответ №2:
Ссылаясь на документы Laravel: Метод sortBy() сортирует коллекцию по заданному ключу. Отсортированная коллекция сохраняет исходные ключи массива, поэтому в этом примере мы будем использовать метод значений для сброса ключей в последовательно пронумерованные индексы.
Итак, вам нужно вызвать sortBy() для коллекции, доставленной через get():
$data = $this->model
->where('start_datetime', '>', now()->startOfWeek()->timestamp)
->where('end_datetime', '<', now()->endOfWeek()->timestamp)
->get()->sortBy('start_datetime');