在我的User类中,我有这个功能:
public function profile() {
return $this->hasOne('App\Profile');
}
在控制器中我使用 $ users = User :: all()来获取所有用户,然后使用 with('users',$ users)将其传递给视图< /强>
在我要显示所有用户配置文件的视图中,我使用foreach循环来获取每个用户数据,如:
@foreach($users as $user)
<div> {{ $user->profile->some_prfiles_table_column_name }} </div>
但我收到了一个错误,所以我不得不使用这样的方括号访问它:
{{ $user->profile['some_profiles_table_column_name'] }}
在另一个视图中,我只通过id User :: find($ id)检索了一个用户,然后我可以正常访问用户配置文件属性作为对象NOT数组,如:
{{ $user->profile->some_profiles_table_column_name }}
我想要理解的是为什么我要获取数组而不是对象?在laravel中有什么不对或这是正常的吗?
提前致谢
答案 0 :(得分:1)
您没有获得阵列。 Eloquent Models实现了PHP的ArrayAccess
接口,允许您像访问数组一样访问数据。
您遇到的问题是您的某个用户没有关联的个人资料。发生这种情况时,$user->profile
将为null
。如果您尝试访问null
上的对象属性,您将获得&#34;尝试获取非对象的属性&#34;错误。但是,如果您尝试访问null
的数组属性,它只会返回null
而不会抛出错误,这就是您的循环看起来像数组一样工作的原因。
用代码说明:
foreach ($users as $user) {
// This will throw an error when a user does not have a profile.
var_export($user->profile->some_profiles_table_column_name);
// This will just output NULL when a user does not have a profile.
var_export($user->profile['some_profiles_table_column_name'];
}
因此,大概是,当用户没有个人资料时,您会想要处理代码中的情况:
@foreach($users as $user)
<div> {{ $user->profile ? $user->profile->some_profiles_table_column_name : 'No Profile' }} </div>
@endforeach