Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Eloquent で relation を扱う基礎

SAW
May 25, 2024

Eloquent で relation を扱う基礎

Laravel 勉強会 in 神戸 の発表資料です。

SAW

May 25, 2024
Tweet

More Decks by SAW

Other Decks in Programming

Transcript

  1. $(whoami) ⽒名: 加藤 宗⼀郎 (30歳) ハンドルネーム: SAW 関⻄の IT エンジニアコミュニティの賑やかし担当

    (⾃称) ⼤阪在住‧愛知出⾝ X (旧 Twitter): @azuki_eater 得意分野: Web ア プ リケーション開発 Laravel, Vue 
  2. Eloquent における relation の定義 Eloquent のモデルクラスで relation を返すメソッドを定義 HasOne: 主のモデルが

    1つの従のモデルのインスタンスを持つ HasMany: 主のモデルが複数の従のモデルのインスタンスを持つ BelongsTo: 従のモデルが 1つの主のモデルのインスタンスを持つ BelongsToMany: 従のモデルが複数の主のモデルのインスタンスを持つ 
  3. 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 モデル例
  4. 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 モデル例
  5. m:n の relation の定義 関連を仲介するテーブル (pivot) を作成 テーブル名は 2つのモデル名をアンダースコアでつないだもの pivot

    の Eloquent モデルは不要 ⽚⽅のモデルでもう⼀⽅のモデルを取得するメソッドを定義 返却型は BelongsToMany 
  6. 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 モデル例
  7. 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 モデル例
  8. 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 モデル例
  9. 定義した 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 の定義
  10. まとめ Laravel の Eloquent での relation の定義⽅法を説明 1 : 1

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