Laravel получит отношения второго уровня

У меня есть три таблицы базы данных:

+------+-----------+---------------------+
| user | user_type | user_type_relations |
+------+-----------+---------------------+

У каждого пользователя может быть много типов, но у одного пользователя может быть только один пользователь. Чтобы сохранить это отношение, я использую третью таблицу отношений со следующей структурой:

+---------------------+
| user_type_relations |
+---------------------+
| id                  |
| user_id             |
| user_type_id        |
+---------------------+

Я определил отношения в моих моделях так:

User модель:

public function userTypeRelations()
{
return $this->hasMany('UserTypeRelations', 'user_id', 'id');
}

UserType модель:

public function userTypeRelation()
{
return $this->hasMany('UserTypeRelations', 'user_type_id', 'id');
}

UserTypeRelations модель:

 public function user()
{
return $this->hasMany('User', 'id', 'user_id');
}

public function userType()
{
return $this->hasMany('UserType', 'id', 'user_type_id');
}

И вот как я пытаюсь получить доступ к типу пользователя определенного пользователя в моем контроллере, прежде чем передать его в представление:

$users = User::with('userTypeRelations')->with('userType')->orderBy($order)->where('status', 'active')->paginate(10);

Я думал, что сначала я получаю значение таблицы отношений, и из этого я легко получу тип пользователя каждого пользователя, но я получаю следующую ошибку:

BadMethodCallException

Call to undefined method Illuminate\Database\Query\Builder::userType()

Что я делаю неправильно?

2

Решение

Я верю, что ваши отношения неправильные. На самом деле это отношения многие ко многим, что означает, что вы можете избавиться от своих UserTypeRelations все вместе.

Так с этим сказал, удали UserTypeRelations.php а затем притвориться, что отношения больше не существует. Laravel будет обрабатывать этот стол для вас.

Затем в вашей пользовательской модели создайте функцию …

public function types()
{
return $this->belongsToMany('UserType', 'user_type_relations','user_type_id', 'user_id');
}

И в вашей модели UserType добавьте функцию …

public function users()
{
return $this->belongsToMany('User', 'user_type_relations', 'user_id', 'user_type_id');
}

Теперь это уже не вложенное отношение.

$user = User::with('types')->find($id);
foreach($user->types as $type) {
echo $type;
}
1

Другие решения

Вы можете загружать множественный вложенные отношения к модели, передавая их обоих в один вызов with:

User::with('userTypeRelations.userType') ...

Источник

0