Есть ли способ получить доступ к атрибутам отношений как к собственным в модели laravel?

У меня 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;
    }

@ bhoomi-patel спасибо за правки :)

Griminvain 21.01.2019 08:24
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
4
1
4 159
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Я не уверен, что рекомендовал бы его, поскольку он просто добавит магия к тому, как все работает, и может быть трудно понять через 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 настолько полон магии, что я не уверен, что это вносит примечательную путаницу. Задокументируйте свои модели, и все будет в порядке. Хорошее решение, кстати!

Soulriser 26.03.2019 22:49

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

Спасибо, но мне это нужно было в самой модели, а не в контроллере.

Griminvain 08.01.2019 12:20

Я думаю, что использование 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.

Griminvain 08.01.2019 12:19

Другие вопросы по теме