2017-05-03 57 views
0

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

,你得到这个错误的原因是东阳

有些用户可能没有配置文件。因此在配置文件中调用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); 
} 

希望它可以帮助

+0

我正在尝试解决方案bt我出现了一些错误。我已经创建了一个特性,包含在用户模块和访问方法内特性通过以下 Route :: get('/ show_user',function(){ return Auth :: user() - > show_users(); }) ; 我收到一个错误:当我用一个由你提供的函数更改旧函数时,调用成员函数show_users()null。你能提出一些建议吗? – vivek321

+0

它的工作!谢谢@oseintow – vivek321

+0

不客气。你能接受它作为正确的答案 – oseintow

1

返回的结果确实是一个集合。这仅仅是一个错字问题

您在profiles

{{ $user->profiles->first_name }} 

忘在这里的s同时请注意,即使你访问first_name这样

{{ $user->profiles['first_name'] }} 

这并不意味着它不一个集合。

如果选中的Illuminate\Database\Eloquent\Model.php源代码,你会看到它如offsetGetoffsetSet,并且offsetExists

更多的信息在这里实现了一些很酷的功能。 PHP ArrayAccess

+0

SRY的错字,但{{$用户> profiles-> first_name}}您好给出了同样的错误,谢谢你的信息 – vivek321

+0

{{$ user-> profiles ['first_name']}}也提供空数据,即使我的数据库表中没有任何这样的记录 – vivek321

相关问题