查询构建器返回数组而不是集合

时间:2017-05-03 12:51:47

标签: laravel laravel-5.3

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

为什么结果以数组而不是集合的形式返回?

2 个答案:

答案 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的来源,您会看到它实现了一些很酷的功能,例如offsetGetoffsetSetoffsetExists

此处提供更多信息。 PHP ArrayAccess