如何在Laravel中的表格之间建立关系?
我有三个表像这样:如何在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 |
+----------+---------+
现在我想获得一个特定用户的所有技能。我能做到这一点通过在原始的SQL查询使用join
条款:
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();
OR
假设你有一个用户,
$user = User::where('id', 1)->first(); // Get the user with id = 1
,并获得该用户的技能:
$user->skills;
OR
如果你不想用雄辩的方式做,你可以使用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
关系。假设您将为skill_user表创建SkillUser模型。下面的代码添加到用户模型
public function skills() {
$this->belongsToMany('App\SkillUser', 'skill_user', 'user_id', 'skill_id');
}
现在,您可以通过
$users->skills();
应该将'public function skills(){'写入哪个模型? – stack
用户模型。将它放在用户模型中 –
谢谢@stack!我使用查询生成器更新了另一种方式。两部作品都取决于您的喜好。 – geckob