如何在Laravel中的表之间建立关系?

时间:2017-02-20 06:57:26

标签: php mysql laravel join

我有三张这样的表:

// 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()等。

3 个答案:

答案 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中给出的示例就此进行了讨论。