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

时间:2019-01-08 03:41:18

标签: php laravel model eloquent relationship

我有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;
    }

3 个答案:

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

在Blade视图文件中:

 @foreach ($users as $user)
      {{ $user->name }} : {{ $user->address }}
 @endforeach