Laravel заказывает красноречивый вызов, orderBy()

у меня есть эта линия

$entries = $company->sheet_entries->where('date', $this->getToday())->take(5);

Я хотел бы заказать по «дате», «убыванию»

Когда-то предполагалось, что будет сделано так.

$entries = $company->sheet_entries->where('date', $this->getToday())->orderBy('date','desc')->take(5);

Но это возвращает ошибку

Method orderBy does not exist.

Я использовал orderBy раньше при вызове красноречия, но с тормозами; например, у меня есть строка ниже, которая работает:

$last = $user->sheet_entries()->where('company_id', $user->company_privileges->company_id)->orderBy('created_at', 'desc')->first();

В чем разница, почему второй пример не работает?


person Community    schedule 16.01.2016    source источник


Ответы (1)


dd($entries = $company->sheet_entries()->orderBy('date', 'DESC')->take(5)->get());

работает!

Я до сих пор не понимаю разницы между использованием $company-> и $company()->, поэтому буду признателен за любые разъяснения.

person Community    schedule 16.01.2016
comment
Если вы обращаетесь к отношению как к свойству, такому как ->sheet_entries, модель извлечет записи и вернет экземпляр Collection, поэтому вы не сможете расширить этот запрос с помощью orderBy, так как он уже был запущен в базе данных. Когда вы обращаетесь к отношению как к методу, такому как ->sheet_entries(), модель возвращает экземпляр Query Builder, который позволяет вам добавлять в ваш запрос элементы, такие как orderBy и все остальное, что предлагает Builder. Эта функциональность реализуется внутри с помощью __get и __call магических методов. - person Bogdan; 16.01.2016