Laravel красноречивые отношения полиморф мультиданных не работает - PullRequest
0 голосов
/ 11 сентября 2018

В качестве заголовка я пытаюсь получить имя данных, используя полиморфную связь.

Когда я получаю один объект, его работа отлично.но когда результат несколько объектов, это не так.

здесь моя попытка.

>>> $page = App\PageAtribut::first()
=> App\PageAtribut {#2863
     id: 1,
     page_id: 1,
     watchable_id: 1,
     watchable_type: "App\Category",
     created_at: "2018-09-11 11:03:20",
     updated_at: "2018-09-11 11:03:20",
   }
>>> $page->watchable
=> App\Category {#2857
     id: 1,
     name: "Series",
     created_at: "2018-09-11 11:01:46",
     updated_at: "2018-09-11 11:01:46",
   }

по коду выше его работы.так как я использую 'id' для получения данных.

далее, я пытаюсь получить все данные, используя условие page_id равное page id.

>>> $page = App\PageAtribut::where('page_id', 1)->get()
=> Illuminate\Database\Eloquent\Collection {#2859
     all: [
       App\PageAtribut {#2860
         id: 1,
         page_id: 1,
         watchable_id: 1,
         watchable_type: "App\Category",
         created_at: "2018-09-11 11:03:20",
         updated_at: "2018-09-11 11:03:20",
       },
       App\PageAtribut {#2861
         id: 2,
         page_id: 1,
         watchable_id: 2,
         watchable_type: "App\User",
         created_at: "2018-09-11 11:03:40",
         updated_at: "2018-09-11 11:03:40",
       },
     ],
   }
>>> $page->watchable
Exception with message 'Property [watchable] does not exist on this collection instance.'

и здесьрезультат.

Exception with message 'Property [watchable] does not exist on this collection instance.'

как получить имя, если существует более одного объекта, как указано выше? ...

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

упоминается в комментариях @Jigar и @Adlan Answer.

Потому что get возвращает collection и сначала возвращает single экземпляр модели.

Так как array collections необходимо использовать forloop для получения атрибутов в каждой модели.

так что код будет.

$page = App\PageAtribut::where('page_id', 1)->get()

тогда

foreach($page->pageatribut  as $p)
{ 
    echo $p->watchable->name; 
}

его возвращают все названия каждой коллекции.

CMIIW.

0 голосов
/ 11 сентября 2018

Пожалуйста, используйте

$page = App\PageAtribut::where('page_id', 1)->first();
dd($page->watchable);

Поскольку get() получит массив коллекции.

...