Фильтровать с помощью Where и упорядочивать с помощью Orderby в одной строке

#laravel #eloquent

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

Вопрос:

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

 $apprentices = Apprentice::orderBy('specialization', 'asc')->orderBy('startYear', 'asc')->orderBy('name', 'asc')->get();
  

Это работает отлично, но теперь я хочу вернуть только наборы данных из Apprentices, которые начались 4 года назад или меньше.
Я пробовал это:

         $apprentices = Apprentice::orderBy('specialization', 'asc')->orderBy('startYear', 'asc')->orderBy('name', 'asc')->get()->where('startYear' <= date("Y") - 4);
  

но это ничего не возвращает.

Это просто незначительная синтаксическая ошибка или моя идея изначально неверна? Заранее спасибо

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

1. Вы пробовали ставить ->get() в конце?

2. @GluePear Я добавил дополнительный ->get() в конец, но это выдало ошибку Too few arguments to function IlluminateSupportCollection::get()

3. Я имел в виду перемещение get с того места, где оно находится сейчас, в конец, а не добавление дополнительного.

4. А, ладно, я виноват. Я попробовал это, и это выдало ошибку SQLSTATE[42S22]: Column not found: 1054 Unknown column '1' in 'where clause' (SQL: select * from apprentices` где 1 нулевой порядок по specialization asc, startYear asc, name asc)` Чего я не понимаю, так это того, что в предложении where он получает только 1, даже если я провел сравнение.

5. Пожалуйста, смотрите мой ответ ниже

Ответ №1:

Ваше where предложение неправильно сформировано, и вам нужно переместить get в конец:

 $apprentices = Apprentice::orderBy('specialization', 'asc')->orderBy('startYear', 'asc')->orderBy('name', 'asc')->where('startYear', '<=', date("Y") - 4)->get();
  

Предложения where см. в руководстве.

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

1. технически это было бы >= но большое вам спасибо за вашу помощь

Ответ №2:

Вы пробовали:

 $apprentices = Apprentice::whereYear('startYear', '<=', CarbonCarbon::now()->subYears(4))->orderBy('specialization', 'asc')->orderBy('startYear', 'asc')->orderBy('name', 'asc')->get();
  

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

1. Это ничего не меняет