我有2个表: users 和 users_details
-用户具有3列[id,用户名,密码]
-users_details具有[id,user_id,name,address]
我为每个模型都有从用户到users_details的关系。
public function details()
{
return $this->hasOne(UserDetails::class, 'user_id', 'id');
}
我的问题在这里:有没有一种方法可以仅以用户身份访问UsersDetails属性。
例如: {{$ user-> name}}:{{$ user-> address}} 而不是 {{$ user-> details-> name}}:{{$ user-> details-> address}}
请记住,这些表仅是示例,没有实际的列范围。我需要用它来实现Laravel / Cashier,但是此插件需要在[users]表中添加4个新列,并且我想将它们放在[users_details]表中。
我什么都没尝试,因为我真的不知道是否有可能。除了目前为止,我知道的唯一解决方法是在User中创建getNameAttribute方法:
public function getNameAttribute()
{
return $this->details->name;
}
答案 0 :(得分:3)
我不确定是否会推荐它,因为它只会使魔术起作用,并且可能会在6个月后变得难以理解。
但是您可以在用户模型中做类似的事情。
已编辑
public function getAttribute($key)
{
// If attribute exists on the user, return that
return parent::getAttribute($key)
// otherwise fallback to details attribute
?? optional($this->details)->getAttribute($key);
}
答案 1 :(得分:1)
是的。
您可以在控制器中完成操作,然后再将$user
传递到视图。
这样。
$user->load('details');
然后将$user
传递给视图,如下所示:
return view('your_view' , compact('user'));
然后在您的视图中使用以下代码:
{{ $user->details_table_field }}
您可以搜索有关急切加载的信息: https://laravel.com/docs/5.7/eloquent-relationships#eager-loading
答案 2 :(得分:1)
我认为使用Laravel Query Builder
和Laravel Scope
也是解决此问题的另一种方法。
为此,您需要添加以下代码行。
在您的用户模型中:
public function scopeUserDetails($query){
return $query->join('users_details', 'users.id', '=', 'users_details.user_id');
}
在您的控制器中:
$users = User::userDetails()->all(); #get all users
//dd($users); #dumping results
return view("view_file", compact('users')); #passing data to view
在Blade视图文件中:
@foreach ($users as $user)
{{ $user->name }} : {{ $user->address }}
@endforeach