Загрузить дополнительную таблицу/данные в пользовательский объект

В Laravel 5.6 я пытаюсь загрузить данные в пользовательский объект, поэтому я могу просматривать учетные данные/настройки пользователя и т. д.

Что раздражает, так это то, что у меня он работал, но по какой-то причине он, кажется, остановился, и я не уверен, что я изменил, чтобы сломать его.

В любом случае я хочу загрузить две таблицы, access и settings. У них обоих есть поле user_id с соответствующим полем user_id.

В моем классе User.php у меня есть две функции:

public function access() {
    return $this->hasMany(Access::class);   
}
public function settings() {
    return $this->hasOne(Settings::class);
}

Я не Use помещаю их в верхнюю часть класса (т.е. use \App\Access), если это имеет значение.

И тогда класс доступа выглядит так:

namespace App;
use Illuminate\Database\Eloquent\Model;
class Access extends Model
{
    protected $table = "access";
}

И класс Settings очень похож:

namespace App;
use Illuminate\Database\Eloquent\Model;
class Settings extends Model
{
    protected $table = "settings";
}

Однако всякий раз, когда я пытаюсь получить доступ к Auth::user()->settings или Auth::user()->access, я получаю сообщение об ошибке undefined index:. Это расстраивает, потому что, как я уже сказал, у меня это работало на днях, и я не уверен, что изменилось.


person Chud37    schedule 02.03.2018    source источник
comment
Можете ли вы вставить полное сообщение об ошибке, которое вы получили?   -  person thefallen    schedule 02.03.2018
comment
@TheFallen Если я запускаю dd(Auth::user()->settings);, я получаю сообщение об ошибке Undefined index: settings   -  person Chud37    schedule 02.03.2018


Ответы (1)


Несколько вещей, которые вы могли бы попробовать здесь. Во-первых, Lazy Eager Load взаимосвязи loadMissing:

// settings
Auth::user()->loadMissing('settings');
// access
Auth::user()->loadMissing('access');

Чтобы загрузить отношение только тогда, когда оно еще не загружено, используйте метод loadMissing.

Во-вторых, вы можете использовать with при запросе пользователя, хотя это не так актуально при использовании фасада аутентификации:

User::with(['settings', 'access'])->where('atribute', $value)->get();

Наконец, если вы хотите, чтобы отношения settings и access всегда возвращались с каждой моделью user, установите атрибут with в модели user:

public class User {
    protected $with = ['settings', 'access'];
    ...
}

Обычно я также определяю обратные отношения в моделях, поэтому Access и Settings будут иметь определенные отношения BelongsTo:

class Access extends Model
{
    protected $table = "access";

    public function user() {
        return $this->belongsTo(User::class);
    }
}

class Settings extends Model
{
    protected $table = "settings";

    public function user() {
        return $this->belongsTo(User::class);
    }
}
person Community    schedule 02.03.2018
comment
Когда я пытаюсь использовать функцию loadMissing(), я получаю следующую ошибку: Call to undefined method Illuminate\Auth\GenericUser::loadMissing() - person Chud37; 02.03.2018
comment
Где вы пытаетесь назвать эти отношения? Illuminate\Auth\GenericUser показывает, что он не использует вашу модель User, поэтому я предполагаю, что это ранний процесс аутентификации? - person ; 02.03.2018
comment
Это было от моего контроллера прямо перед тем, как я передал его в представление. - person Chud37; 02.03.2018
comment
ФУ. Хорошо, я нашел проблему. Благодаря вашим комментариям я наткнулся на это: stackoverflow.com/a/36902280/1445985 у меня было два массива пользователей в файл auth.php. Блин! Однако, спасибо! - person Chud37; 02.03.2018
comment
Если вы хотите обновить свой ответ, я приму его! Вы все-таки помогли мне добраться туда :), и я очень благодарен за это. - person Chud37; 02.03.2018