'hasOne'相关对象的访问属性

时间:2017-05-20 00:29:22

标签: php laravel orm eloquent

在我的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中有什么不对或这是正常的吗?

提前致谢

1 个答案:

答案 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