Есть ли способ получить доступ к атрибутам отношений как к собственным в модели laravel? - PullRequest
0 голосов
/ 08 января 2019

У меня есть 2 таблицы: пользователи и users_details

- у пользователей есть 3 столбца [id, имя пользователя, пароль]

- users_details имеет [id, user_id, имя, адрес]

У меня есть модели для каждой из них с отношением от пользователей к 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, но этому плагину нужно 4 новых столбца в таблице [users], и я хочу поместить их в таблицу [users_details].

Я ничего не пробовал, потому что я действительно не знаю, возможно ли это. За исключением на данный момент, единственный известный мне обходной путь - сделать метод getNameAttribute в User:

    public function getNameAttribute()
    {
        return $this->details->name;
    }

Ответы [ 3 ]

0 голосов
/ 08 января 2019

да. Вы можете сделать это в контроллере перед передачей $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

0 голосов
/ 08 января 2019

Я думаю, использование 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
0 голосов
/ 08 января 2019

Я не уверен, что рекомендую его, так как он просто добавит магию к тому, как все работает, и через 6 месяцев это будет трудно понять.

Но вы можете сделать что-то подобное в своей модели User.

Отредактированный

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);
}
...