У меня 2 таблицы: пользователи и 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-> адрес}}
Имейте в виду, что эти таблицы являются только примерами и не имеют реального диапазона столбцов. Мне это нужно для реализации Laravel / Cashier, но этому плагину нужны 4 новых столбца в таблице [users], и я хочу поместить их в таблицу [users_details].
Я ничего не пробовал, потому что не знаю, возможно ли это. За исключением того момента, когда я знаю единственный обходной путь, это сделать метод getNameAttribute в User:
public function getNameAttribute()
{
return $this->details->name;
}






Я не уверен, что рекомендовал бы его, поскольку он просто добавит магия к тому, как все работает, и может быть трудно понять через 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);
}
Laravel настолько полон магии, что я не уверен, что это вносит примечательную путаницу. Задокументируйте свои модели, и все будет в порядке. Хорошее решение, кстати!
да.
вы можете сделать это в контроллере, прежде чем передавать $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
Спасибо, но мне это нужно было в самой модели, а не в контроллере.
Я думаю, что использование 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
Это полезно, я мог бы использовать его как глобальную область видимости, и данные всегда будут доступны для пользователя $ user.
@ bhoomi-patel спасибо за правки :)