Laravel ошибка: свойство [имя] не существует в этом экземпляре коллекции - PullRequest
1 голос
/ 03 марта 2020

Я пытаюсь найти партнера для каждого заказа, используя Laravel коллекций ресурсов. Но это выдает ошибку:

Property [name] does not exist on this collection instance

Я получаю partners таким образом

Order_product. php

//...
class Order_product extends Model
{
    protected $fillable = ['order_id', 'product_id', 'quantity', 'price'];

public function partner()
  {
   return $this->hasManyThrough(
         'App\Partner', 'App\Order',
      'partner_id', 'id', 'order_id');
        //orders  partners  order_products
   }
//...

Ресурсы \ Order_product. php

class Order_product extends JsonResource
{
   public function toArray($request)
    {
     return [
            'id'         => $this->id,
            'order_id'   => $this->order_id,
            'product_id' => $this->product_id,
            'quantity'   => $this->quantity,
            'price'      => $this->price,
            'status'     => $this->order->status,
          'product_name' => $this->prod->name,

           //return error
          'partner_name' => $this->partner->name,

         ];
/*
//this method return:
//Invalid argument supplied for foreach() {"exception":"[object]... 

$partners = [];

        foreach($this->collection as $partner) {

             array_push($partners, [

                // 'partner_name' => $this->partner->name
             ]);

        }

        return $partners;
*/
    }
}

Каждый заказ имеет одно имя партнера. В будущем я сгруппирую их, но теперь мне просто нужно вывести partner_name

Ответы [ 2 ]

0 голосов
/ 03 марта 2020

Когда вы используете hasManyThrough или hasMany laravel, отношение возвращается Illuminate\Database\Eloquent\Collection Экземпляр.

Если вы хотите получить имя, у вас должен быть один Model экземпляр.

Решение 1 : $this->parthner->first()->name

Решение 2 : посмотрите это hasOneThough


public function partner(){
   return $this->hasOneThrough(
         'App\Partner', 'App\Order',
      'partner_id', 'id', 'order_id');
}

Зависит от вашего logi приложения c

Надеюсь, это поможет вам

0 голосов
/ 03 марта 2020

- это отношения, когда вы используете hasMany или hasManyThrough, он возвращает вам коллекцию, поэтому вы должны использовать его в foreach или использовать с index

return [
'product_name' => $this->prod->first()->name,  //first array in collection using first()
   ];

ИЛИ

return [
'product_name' => $this->prod[0]->name,  //first array in collection using index
   ];

или вы можете написать этот код в foreach !

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...