一、什麼是 Eloquent 關聯?
在 Laravel 中,Eloquent ORM 提供了簡潔的方式來定義資料表之間的關聯,讓你可以:
-
自動查詢關聯資料
-
簡化 SQL JOIN
-
使用直覺語法操作模型關聯
一對一(One to One)
範例情境
一個 User 有一個 Profile(個人檔案)
資料表結構
| users | profiles |
|---|---|
| id | id |
| name | user_id (外鍵) |
| bio |
Model 寫法
在 User model:
public function profile()
{
return $this->hasOne(Profile::class);
}
在 Profile model:
public function user()
{
return $this->belongsTo(User::class);
}
使用方式
$user = User::find(1); $bio = $user->profile->bio; $profile = Profile::find(1); $name = $profile->user->name;
一對多(One to Many)
範例情境
一個 Agency 有很多 Girl
資料表結構
| agencies | girls |
|---|---|
| id | id |
| name | name |
| agency_id (外鍵) |
Model 寫法
在 Agency model:
public function girls()
{
return $this->hasMany(Girl::class);
}
在 Girl model:
public function agency()
{
return $this->belongsTo(Agency::class);
}
使用方式
$agency = Agency::find(1); $girls = $agency->girls; $girl = Girl::find(2); $agencyName = $girl->agency->name;
多對多(Many to Many)
範例情境
一個 Girl 可以屬於多個 Agency
一個 Agency 也可以有多個 Girl
資料表結構
| agencies | girls | agency_girl_maps (pivot table) |
|---|---|---|
| id | id | girl_id |
| name | name | agency_id |
Model 寫法
在 Girl model:
public function agencies()
{
return $this->belongsToMany(Agency::class, 'agency_girl_maps', 'girl_id', 'agency_id');
}
在 Agency model:
public function girls()
{
return $this->belongsToMany(Girl::class, 'agency_girl_maps', 'agency_id', 'girl_id');
}
使用方式
$girl = Girl::find(1); $girl->agencies; // 所屬 agency 列表 $agency = Agency::find(2); $agency->girls; // 所屬 girl 列表
補充:with() 預載入關聯(避免 N+1)
$girls = Girl::with('agencies')->get(); // 預先載入 agency
$agencies = Agency::with('girls')->get(); // 預先載入 girls
Laravel 常見關聯方法一覽
| 方法 | 關聯型態 | 用於哪邊 |
|---|---|---|
| hasOne() | 一對一 | 父模型(如 User) |
| belongsTo() | 一對一 / 多 | 子模型(如 Profile) |
| hasMany() | 一對多 | 父模型(如 Agency) |
| belongsToMany() | 多對多 | 雙方模型都要設定 |
| with() | 預載入關聯資料 | 查詢時 |
| withPivot() | 多對多時讀取中介表欄位 | belongsToMany 中使用 |