Метод лезвия Laravel не существует в пользовательской модели. - PullRequest
0 голосов
/ 14 марта 2019

В моей пользовательской модели (App\User.php) я объявляю следующие отношения:

public function actionables() {
  return $this->hasMany(Actionable::class, 'owner_id', 'id');
}

В моей схеме миграции для таблицы actionables я указываю следующий внешний ключ:

$table->foreign('owner_id')->references('id')->on('users')->onDelete('cascade');

Когда я звоню

{{ auth()->user()->actionables->where('act_type', 'order')->latest()->content }}

В режиме блэйда я получаю следующее сообщение об ошибке:

Method Illuminate\Database\Eloquent\Collection::latest does not exist. 

Я пытался использовать ->get() и использовать другие способы доступа кпользовательская модель (Auth::user), но пока проблема не решена.

Ответы [ 5 ]

4 голосов
/ 14 марта 2019

Различие, которое затушевывают другие ответы, заключается в использовании конструктора запросов и использования коллекции. Когда вы вызываете отношение с помощью свойства, Eloquent извлекает все результаты, а затем возвращает коллекцию (которая в основном представляет собой расширенный массив). Итак, когда вы делаете

auth()->user()->actionables 

Laravel выполняет SQL-запрос, а затем возвращает все результаты в виде коллекции.

SELECT * FROM actionables WHERE owner_id = ?

В классе коллекции есть метод where, который работает аналогично методу построителя запросов, но важно понимать, что он выполняет поиск в PHP, а не в SQL, потому что запрос уже выполнен и больше не может быть изменен. latest() существует в построителе запросов, но не в коллекции, из которой исходит ваша ошибка.

Чтобы использовать взаимосвязь в построителе запросов, вам нужно вызвать связь как функцию. user()->actionables()

auth()->user()->actionables()->where('act_type', 'order')->latest()->first() 

Приведенный выше запрос выполнит SQL-запрос и вернет только ту запись, которую вы ищете.

SELECT * FROM actionables WHERE act_type = order AND WHERE owner_id = ? ORDER BY created_at DESC LIMIT 1
1 голос
/ 14 марта 2019

latest не существует за пределами Collection методов.

чтобы получить последний элемент вашего запроса к базе данных, вы должны применить этот запрос:

* Обратите внимание, что в таблице Actionable должно быть created_at.

auth()->user()->actionables()->where('act_type', 'order')->orderBy('created_at', 'desc')->first()->content
1 голос
/ 14 марта 2019

Вы должны использовать построитель запросов actionables(), а не коллекцию actionables, то есть:

{{ auth()->user()->actionables()->where('act_type', 'order')->latest()->first()->content }}
0 голосов
/ 14 марта 2019

В коллекции нет последнего метода, этот метод используется в построителе запросов.

Вместо этого попробуйте последний вариант.

Ссылка: https://laravel.com/docs/5.8/collections#available-methods

0 голосов
/ 14 марта 2019

Должно быть ->last(), а не ->latest()

{{ auth()->user()->actionables->where('act_type', 'order')->last()->content ?? ""}}
...