有没有办法在 laravel 模型中访问自己的关系属性?

Posted

技术标签:

【中文标题】有没有办法在 laravel 模型中访问自己的关系属性?【英文标题】:Is there a way to access relationship attributes as own in laravel model? 【发布时间】:2019-06-02 17:44:39 【问题描述】:

我有 2 个表:usersusers_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 BuilderLaravel 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 中相同模型中的值获得不同的值以及行数?

Laravel 查询模型关系

具有预加载关系的 Laravel 模型

Laravel 动态关系 - 在急切加载时访问模型属性

在 laravel 中定义 eloquent 关系时添加额外的约束

Laravel - 向工厂创建的模型添加关系