属性[name]在此集合实例上不存在
属性[name]在此集合实例上不存在
我在数据库中有3个表(users,areas,area_user),
Users表:
id
name
username
password
areas表:
id
name
area_user表:
id
user_id
area_id
我试图创建一个(用户列表页面),它将显示所有用户表列和用户分配的区域。
User.php模型文件
belongsToMany('App\Area','area_user'); } }
Area.php模型文件:
belongsToMany('App\User','area_user','area_id','user_id'); } }
UserController@index文件:
middleware('auth'); } /** * 显示资源列表。 * * @return \Illuminate\Http\Response */ public function index(){ $users = User::get(); return view('users._list', ['users'=> $users] ); } }
最后是表视图文件:
@foreach($users as $u)@endforeach {{$u->name}} {{$u->areas}} {{route('show_user', ['id' => $u->id])}}
如果我在用户表视图中只使用areas属性($u->areas),它将显示所有的areas列:
[
{
"id": 3,
"name": "C",
"location_id": 1,
"created_at": null,
"updated_at": null,
"pivot": {
"user_id": 4,
"area_id": 3
}
},
{
"id": 4,
"name": "D",
"location_id": 2,
"created_at": null,
"updated_at": null,
"pivot": {
"user_id": 4,
"area_id": 4
}
}
]
@foreach($users as $u)@endforeach {{$u->name}} {{$u->areas->name}} {{route('show_user', ['id' => $u->id])}}
请注意,如果我在上面的视图中指定Areas关系中的列名($u->areas->name),则会显示错误:
属性[name]在此集合实例上不存在。(视图:C:\xampp\htdocs)
如何在视图文件中只显示(areas.name)列?
(Property [name] does not exist on this collection instance)这个问题的出现的原因是因为areas
是一个集合(collection),而不是一个模型实例(model instance)。在集合上访问属性时,会出现该错误。
解决方法是使用pluck
方法获取areas
集合中的name
属性,然后使用implode
方法将其连接为字符串,最后在HTML模板中显示出来。
具体代码如下:
<td>{{ $user->areas->pluck('name')->implode(' ') }}</td>
通过这个解决方法,我们可以在HTML模板中正确地显示areas
集合中的name
属性。这样就避免了出现(Property [name] does not exist on this collection instance)这个错误。
(Property [name] does not exist on this collection instance)这个问题的出现原因是因为在循环中使用了错误的语法。由于areas
是一个集合,所以应该使用循环来遍历它。解决方法是使用正确的循环语法来遍历areas
集合,同时确保在循环中正确使用变量。
以下是解决方法的示例代码:
($users as $u) <tr role="row" class="odd"> <td class="sorting_1">{{$u->name}}</td> <td></td> <td> ($u->areas as $area) {{$area->name}}, </td> <td>{{route('show_user', ['id' => $u->id])}}</td> </tr></tbody>
另外,如果您想要用逗号分隔它们,可以使用下面的代码,而无需使用循环:
($users as $u) <tr role="row" class="odd"> <td class="sorting_1">{{$u->name}}</td> <td></td> <td> {{ $u->areas->pluck('name')->implode(', ') }} </td> <td>{{route('show_user', ['id' => $u->id])}}</td> </tr></tbody>
这个解决方法在我的laravel应用程序从4.2升级到5.x时解决了类似的问题,并且运行正常。