У меня есть три таблицы базы данных:
+------+-----------+---------------------+
| 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()
Что я делаю неправильно?
Я верю, что ваши отношения неправильные. На самом деле это отношения многие ко многим, что означает, что вы можете избавиться от своих 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;
}
Вы можете загружать множественный вложенные отношения к модели, передавая их обоих в один вызов with
:
User::with('userTypeRelations.userType') ...