User.php(用户模型)
class User extends Authenticatable
{
public function profiles(){
return $this->hasOne('App\Profile');
}
}
Profile.php(个人资料模型)
class Profile extends Model
{
public function users(){
return $this->belongsTo('App\User');
}
}
将数据返回到视图的函数:
public function show_users(){
$users = User::where('id','!=',Auth::user()->id)->get();
return view('pages.show_users')->withUsers($users);
}
show_user.blade.php(查看)
@foreach($users as $user)
{{$user->profile->first_name}} //Gives error:Trying to get property of non-object
{{$user->profiles['first_name']}} // Gives desired result
@endforeach
为什么结果以数组而不是集合的形式返回?
答案 0 :(得分:2)
您收到该错误的原因是
某些用户可能没有个人资料。因此,在作为空对象的配置文件上调用first_name将引发错误。
你可以做什么 php7
@foreach($users as $user)
{{$user->profiles->first_name ?? 'No first name'}}
@endforeach
php 5.6及以下
@foreach($users as $user)
@if($user->profiles->isNotEmpty())
{{$user->profiles->first_name}}
@else
No name
@endif
@endforeach
此外,为什么不使用预先加载来加载您的配置文件以获得性能优势。您的查询现在将创建N + 1查询问题。
您可以将查询更改为
public function show_users()
{
$users = User::with('profiles')->where('id','!=',Auth::user()->id)->get();
return view('pages.show_users')->withUsers($users);
}
希望有所帮助
答案 1 :(得分:1)
返回的结果确实是一个集合。这只是一个错字问题
您在s
profiles
{{ $user->profiles->first_name }}
另请注意,即使您这样访问first_name
{{ $user->profiles['first_name'] }}
这并不意味着它不是一个集合。
如果您查看Illuminate\Database\Eloquent\Model.php
的来源,您会看到它实现了一些很酷的功能,例如offsetGet
,offsetSet
和offsetExists
此处提供更多信息。 PHP ArrayAccess