#laravel
#laravel
Вопрос:
В Laravel у меня есть модель заказов, в которой каждый заказ принадлежит только одному пользователю,
Я хочу возвращать только имена пользователей и идентификаторы заказов при получении заказов, поэтому в моем OrdersController у меня есть эта функция
public function getAllOrders()
{
$orders = Order::all();
return new OrderResource($orders);
}
и в моем OrderResource я
public function toArray($request)
{
return [
'user' => $this->user,
'id' => $this->id,
];
}
Я получаю сообщение об ошибке Property [user] does not exist on this collection instance
.
Я думаю, причина в том, что $orders
это коллекция, и я должен перебирать ее и получать для каждого заказа пользователя, связанного с ней, но я понятия не имею, как это сделать.
Примечание: я использую OneToMany и принадлежу модели пользователей и заказов. итак, в таблице заказов нет
user
столбца, я хочу получить пользователя из отношения.
Комментарии:
1. Мой ответ решил вашу проблему?
Ответ №1:
При использовании коллекции используйте следующее;
public function getAllOrders()
{
return OrderResource::collection(Order::all());
}
При использовании модели используйте следующее;
public function getOrder($id)
{
return new OrderResource(Order::find($id));
}
Дополнительная информация в документации:https://laravel.com/docs/7.x/eloquent-resources#concept-overview
Примечание: Чтобы избежать N 1 запросов, вы должны получать свои заказы следующим образом; Order::with('user')->get();
вместо Order::all()
Разница в том, что Order::with('user')->get();
будет выполняться два запроса.
select * from orders
select * from users where id in (?, ?, ?, ?, ...)
Тогда как Order::all()
будет выполняться N 1 запросов (N = количество заказов)
select * from orders
select * from users where id = ?
select * from users where id = ?
select * from users where id = ?
- … и так далее