【问题标题】:Is there a way to access relationship attributes as own in laravel model?有没有办法在 laravel 模型中访问自己的关系属性?
【发布时间】: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 感谢您的编辑 :)

标签: php laravel model eloquent relationship


【解决方案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 可用
猜你喜欢
  • 2022-08-23
  • 1970-01-01
  • 2020-10-14
  • 2012-10-28
  • 2022-08-02
  • 2020-02-08
  • 1970-01-01
  • 1970-01-01
  • 2022-09-22
相关资源
最近更新 更多