У меня есть три таблицы, подобные этим:
// 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()
так далее ..
Чтобы сделать это красноречивым образом, нужно добавить отношения. В вашем случае это отношения многие ко многим, поэтому в 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();
Вы должны использовать belongsToMany
отношения. Предполагается, что вы создадите модель SkillUser для таблицы skill_user. Добавьте следующий код в модель пользователя
public function skills() {
$this->belongsToMany('App\SkillUser', 'skill_user', 'user_id', 'skill_id');
}
Теперь вы можете получить к нему доступ
$users->skills();
Я полагаю, вы говорите о Many to Many
отношения между пользователями и навыками, то пример, приведенный в Laravel многие ко многим говорит об этом.