Slide 1

Slide 1 text

Eloquent で relation を扱う基礎 Laravel 勉強会 in 奈良 2024 / 0 5 / 2 5 SAW

Slide 2

Slide 2 text

$(whoami) ⽒名: 加藤 宗⼀郎 (30歳) ハンドルネーム: SAW 関⻄の IT エンジニアコミュニティの賑やかし担当 (⾃称) ⼤阪在住‧愛知出⾝ X (旧 Twitter): @azuki_eater 得意分野: Web ア プ リケーション開発 Laravel, Vue

Slide 3

Slide 3 text

動機 久々に Laravel を触って Eloquent で relation を扱う⽅法の知識が曖 昧になっていた 公式ドキュメントをもとに Eloquent での relation の扱いを復習し て理解を深める

Slide 4

Slide 4 text

Eloquent における relation の定義 Eloquent のモデルクラスで relation を返すメソッドを定義 HasOne: 主のモデルが 1つの従のモデルのインスタンスを持つ HasMany: 主のモデルが複数の従のモデルのインスタンスを持つ BelongsTo: 従のモデルが 1つの主のモデルのインスタンスを持つ BelongsToMany: 従のモデルが複数の主のモデルのインスタンスを持つ

Slide 5

Slide 5 text

1:1 の relation の定義 主のモデル側: 従のモデルを取得するメソッドを定義 返却型は HasOne 従のモデル側: 主のモデルを取得するメソッドを定義 返却型は BelongsTo

Slide 6

Slide 6 text

1:1 の relation の実装例 class User extends Model { public function memberCard(): HasOne { return $this->hasOne(MemberCard::class); } 
 } MemberCard (従) との relation の定義 class MemberCard extends Model { public function member(): BelongsTo { return $this->belongsTo(User::class); } 
 } User (主) との relation の定義 User MemberCard 1 1 1:1 の ER モデル例

Slide 7

Slide 7 text

1 :n の relation の定義 主のモデル側: 従のモデルを取得するメソッドを定義 返却型は HasMany 従のモデル側: 主のモデルを取得するメソッドを定義 返却型は BelongsTo

Slide 8

Slide 8 text

1 :n の relation の実装 class User extends Model { public function posts(): HasMany { return $this->hasMany(Post::class); } 
 } Post (従) との relation の定義 class Post extends Model { public function author(): BelongsTo { return $this->belongsTo(User::class); } 
 } User (主) との relation の定義 User Post 1 n 1 :n の ER モデル例

Slide 9

Slide 9 text

m:n の relation の定義 関連を仲介するテーブル (pivot) を作成 テーブル名は 2つのモデル名をアンダースコアでつないだもの pivot の Eloquent モデルは不要 ⽚⽅のモデルでもう⼀⽅のモデルを取得するメソッドを定義 返却型は BelongsToMany

Slide 10

Slide 10 text

m:n の relation の実装 class User extends Model { public function roles(): BelongsToMany { return $this->belongsToMany(Role::class); } 
 } Role との relation の定義 class Role extends Model { public function users(): BelongsToMany { return $this->belongsToMany(User::class); } 
 } User との relation の定義 RoleUser Role 1 m User 1 n m:n の ER モデル例

Slide 11

Slide 11 text

HasOneThrough あるモデルを経由して 1:1 のrelation を表現 hasOneThrough() の引数に取得対象と中間のモデルを指定 第1引数: 取得対象のモデルクラス名 第2引数: 中間のモデルのクラス名 class User extends Model { public function point(): HasOneThrough { return $this->hasOneThorugh(MemberPoint::class, MemberCard::class); } 
 } MemberCard を経由した relation の定義 User MemberCard 1 1 MemberPoint 1 1 HasOneThrough の ER モデル例

Slide 12

Slide 12 text

HasManyThrough あるモデルを経由して 1:n の relation を表現 hasManyThrough() の引数に取得対象と中間のモデルを指定 第1引数: 取得対象のモデルクラス名 第2引数: 中間のモデルのクラス名 class User extends Model { public function Transactions(): HasManyThrough { return $this->hasManyThorugh(Transaction::class, MemberCard::class); } 
 } MemberCard を経由した relation の定義 User MemberCard 1 1 Transaction 1 n HasManyThrough の ER モデル例

Slide 13

Slide 13 text

定義した relation を取得する⽅法 モデルに定義したメソッドをプロパティとして取得 Eloquent モデルのインスタンスまたは Collection を取得 HasOne, BelongsTo, HasOneThrough: Eloquent のインスタンス HasMany, BelongsToMany, HasManyThrough: Eloquent の Collection $memberCard = User::findOrFail($id)->memberCard; // MemberCard のインスタンス $user = $memberCard->member; // User のインスタンス $point = $user->point; // MemberPoint のインスタンス $roles = User::findOrFail($id)->roles; // Roles のインスタンスの Collection MemberCard を経由した relation の定義

Slide 14

Slide 14 text

まとめ Laravel の Eloquent での relation の定義⽅法を説明 1 : 1 , 1 :n, m:n の relation の定義⽅法を説明 定義した relation のモデルを取得する⽅法を取得 Eloquent モデルで定義したメソッドをプロパティとして取得

Slide 15

Slide 15 text

ご清聴ありがとうございました