2017-02-20 144 views
2

我有三個表像這樣:如何在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()等。

回答

3

要雄辯的方式做,你需要補充的關係。你的情況,它是許多一對多的關係,以便在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

2

您必須使用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

用戶模型。將它放在用戶模型中 –

1

訪問它,我認爲你說的用戶和技能之間約Many to Many關係,那麼在Laravel many-to-many給出的例子講一下吧。

相關問題