Laravel: свойство [пользователь] не существует в этом экземпляре коллекции

#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 = ?
  • … и так далее