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

如何在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(); 
+0

谢谢@stack!我使用查询生成器更新了另一种方式。两部作品都取决于您的喜好。 – geckob

您必须使用belongsToMany关系。假设您将为skill_user表创建SkillUser模型。下面的代码添加到用户模型

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

现在,您可以通过

$users->skills(); 
+0

应该将'public function skills(){'写入哪个模型? – stack

+0

用户模型。将它放在用户模型中 –

访问它,我认为你说的用户和技能之间约Many to Many关系,那么在Laravel many-to-many给出的例子讲一下吧。