Как я могу установить связь между таблицами в Laravel?

У меня есть три таблицы, подобные этим:

// users
+----+-----------+
| id | user_name |
+----+-----------+
| 1  | Jack      |
| 2  | Peter     |
| 3  | John      |
+----+-----------+

// skills
+----+------------+
| id | skill_name |
+----+------------+
| 1  | PHP        |
| 2  | HTML       |
| 3  | Laravel    |
| 4  | MySQL      |
| 5  | jQuery     |
+----+------------+

// skill_user
+----------+---------+
| skill_id | user_id |
+----------+---------+
| 2        | 1       |
| 5        | 1       |
| 1        | 2       |
| 2        | 2       |
| 4        | 2       |
+----------+---------+

Теперь я хочу получить все навыки одного конкретного пользователя. Я могу сделать это с помощью join предложение в сыром запросе sql:

SELECT s.skill_name
FROM skills s
JOIN skill_user su ON s.id = su.skill_id
WHERE su.user_id = :user_id

/* output (assuming :user_id is 1)
+------------+
| HTML       |
| jQuery     |
+------------+

Ок, все хорошо. Теперь я хочу знать, как я могу сделать это, добавив метод в модель платформы Laravel? Все, что я пытаюсь сделать, это использовать belongsTo(), hasOne(), hasMany() так далее ..

2

Решение

Чтобы сделать это красноречивым образом, нужно добавить отношения. В вашем случае это отношения многие ко многим, поэтому в User.phpДобавьте эту функцию, чтобы объявить отношения:

public function skills() {
$this->belongsToMany(\App\Skill::class, 'skill_user', 'user_id', 'skill_id');
}

Затем,

Получите к нему доступ, чтобы загрузить его:

$users = \App\User::with('skills')->get();

ИЛИ ЖЕ

Скажем, у вас есть один пользователь,

$user = User::where('id', 1)->first(); // Get the user with id = 1

и получить навык для этого пользователя:

$user->skills;

ИЛИ ЖЕ

Если вы не хотите использовать Eloquent, вы можете использовать Query Builder. Обратите внимание, что, используя этот метод, вы в основном присоединяетесь к нему вручную, поэтому вам не нужно добавлять какой-либо метод в модель:

 \DB::table('users')
->join('skill_user', 'skill_user.user_id','=', 'users.id')
->join('skills', 'skill_user.skill_id', '=', 'skills.id')
->select('*')
->where('users.id', 1)
->get();
3

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

Вы должны использовать belongsToMany отношения. Предполагается, что вы создадите модель SkillUser для таблицы skill_user. Добавьте следующий код в модель пользователя

public function skills() {
$this->belongsToMany('App\SkillUser', 'skill_user', 'user_id', 'skill_id');
}

Теперь вы можете получить к нему доступ

$users->skills();
2

Я полагаю, вы говорите о Many to Many отношения между пользователями и навыками, то пример, приведенный в Laravel многие ко многим говорит об этом.

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector