有没有办法在 laravel 模型中访问自己的关系属性?
Posted
技术标签:
【中文标题】有没有办法在 laravel 模型中访问自己的关系属性?【英文标题】:Is there a way to access relationship attributes as own in laravel model? 【发布时间】:2019-06-02 17:44:39 【问题描述】:我有 2 个表:users 和 users_details
-- 用户有 3 列 [id,username,password]
-- 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] 表中。
我没有尝试过任何事情,因为我真的不知道这是否可行。除了我知道的唯一解决方法是在用户中创建 getNameAttribute 方法:
public function getNameAttribute()
return $this->details->name;
【问题讨论】:
@bhoomi-patel 感谢您的编辑 :) 【参考方案1】:我不确定我是否会推荐它,因为它只会为事情的运作方式添加魔力,并且可能在 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);
【讨论】:
Laravel 充满了魔力,我不确定这是否会增加任何值得注意的混乱。记录你的模型,你应该没问题。顺便说一句,很好的解决方案!【参考方案2】:是的。
您可以在将 $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
【讨论】:
谢谢,但我需要在模型本身而不是在控制器中。【参考方案3】:我认为使用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
在您的刀片视图文件中:
@foreach ($users as $user)
$user->name : $user->address
@endforeach
【讨论】:
这很有用,我可以像全局范围一样使用它,并且数据将始终对 $user 可用以上是关于有没有办法在 laravel 模型中访问自己的关系属性?的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法根据 laravel 中相同模型中的值获得不同的值以及行数?