我有三张这样的表:
// 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()
等。
答案 0 :(得分:3)
要以Eloquent方式执行,您需要添加关系。在你的情况下,它是多对多关系所以在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();
答案 1 :(得分:2)
您必须使用belongsToMany
关系。假设您将为skill_user表创建SkillUser模型。将以下代码添加到用户模型
public function skills() {
$this->belongsToMany('App\SkillUser', 'skill_user', 'user_id', 'skill_id');
}
现在您可以通过
访问它了$users->skills();
答案 2 :(得分:1)
我假设您在讨论用户与技能之间的Many to Many
关系,然后Laravel many-to-many中给出的示例就此进行了讨论。