Laravel雄辩的关系多态多数据不起作用

时间:2018-09-11 08:06:22

标签: php eloquent laravel-5.5

作为标题, 我正在尝试使用多态关系获取数据的名称。

当我得到一个对象时,它的工作就完美了。但是当结果有多个对象时不是。

这是我的尝试。

>>> $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 :(得分:0)

请使用

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

因为get()会得到一个数组的集合。

答案 1 :(得分:0)

在@Jigar评论和@Adlan回答中提到。

因为get返回一个collection并首先返回一个single模型实例。

由于其array collections的需要,因此需要使用forloop来获取每个模型的属性。

代码就是这样。

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

然后

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

它返回每个集合的所有名称。

CMIIW。