Laravel 5.1 - сводная таблица между тремя таблицами, лучший вариант?
У меня есть 3 таблицы: пользователи, языки и уровни.
У одного пользователя много языков и уровней.
Пример:
- Хорхе говорит: английский продвинутый, испанский основной.
- Питер говорит: английский продвинутый, итальянский средний, французский базовый.
- Говорит Луис: испанский продвинутый, английский продвинутый, итальянский средний.
Пользователь таблицы
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(50) | NO | | NULL | |
| lastname | varchar(50) | NO | | NULL | |
+----------+-------------+------+-----+---------+----------------+
Языки таблиц
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(50) | NO | | NULL | |
+-------+-------------+------+-----+---------+----------------+
Табличные уровни
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(50) | NO | | NULL | |
+-------+-------------+------+-----+---------+----------------+
Сводная таблица
+-------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+----------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| user_id | int(11) | NO | | NULL | |
| language_id | int(11) | NO | | NULL | |
| level_id | int(11) | NO | | NULL | |
| created_at | datetime | YES | | NULL | |
| updated_at | datetime | YES | | NULL | |
+-------------+----------+------+-----+---------+----------------+
Вопрос в том, как создать сводную таблицу с тремя таблицами (в doc laravel пример только с двумя таблицами) возможно с тремя таблицами? Как отношения с красноречивым?
2 ответа
Ну, у меня есть что-то в проекте с использованием трех таблиц и в качестве сводной, поэтому я запускаю:
Modelo User:
class User extends Model{
public function levels(){
return $this->belongsToMany('App\Level','name pivot table')->withPivot('language_id');
}
public function languages(){
return $this->belongsToMany('App\Language','name pivot table')->withPivot('level_id');
}
}
Уровни Modelo:
class Level extends Model{
public function users(){
return $this->belongsToMany('App\User','name pivot table')->withPivot('language_id');
}
public function languages(){
return $this->belongsToMany('App\Language','name pivot table')->withPivot('user_id');
}
}
Язык таблицы:
class Language extends Model{
public function users(){
return $this->belongsToMany('App\User','name pivot table')->withPivot('level_id');
}
public function levels(){
return $this->belongsToMany('App\Level','name pivot table')->withPivot('user_id');
}
}
Я надеюсь, что вы используете эту опцию, которую я использую для доступа к информации из всех трех таблиц
использовать:
$user = User::find(1);
$user->levels->pivot->language_id;
$user->levels->name;
$user->languages->pivot->level_id;
$user->languages->name;
Вы не опубликовали свои отношения, но вы можете создать отдельную модель сводной таблицы. Таким образом, вы можете определить отношения с пользовательской моделью, языковой моделью и моделью уровня в этой сводной модели.