0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Laravel リレーション 1対多 多対多 とかまとめ

Last updated at Posted at 2022-10-04

リレーション、わかっているつもりでも設計しようとする時によく混乱するのでまとめ。

1対1

hasOne。(あまり使ったことない。)

Userが親モデル(主)。
Phoneが子モデル(従)。子モデルが user_id カラムを持つ。(親モデル名_id)。親モデルの「スネークケース」名に「_id」
親も子も名前は単数形。

user.php
class User extends Model
{
    /**
     * ユーザーに関連している電話の取得
     */
    public function phone()
    {
        return $this->hasOne(Phone::class);
    }
}
phone.php
class Phone extends Model
{
    /**
     * phonesテーブルにuser_idカラムが必要
     */
    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

外部キーがuser_id で無い場合は第2引数にカスタムキー名を渡す。

phone.php
class Phone extends Model
{
public function user()
{
    return $this->belongsTo(User::class, 'foreign_key');
}
}

1対多(One to Many)

hasMany。メソッドの名前を複数形にする必要あり。
親モデル hasMany 子モデル。もしくは Class 〇〇 hasMany 子モデルと考えると混乱しづらい。

user.php
class User extends Model
{
    /**
     * 名前を複数形にする
     */
    public function phones()
    {
        return $this->hasMany(Phone::class);
    }
}

belongsToは1対1の場合と同じ。単数形のメソッド名。

phone.php
class Phone extends Model
{
    /**
     * phonesテーブルにuser_idカラムが必要
     */
    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

多対多(Many to Many)

中間テーブル(pivot table)が必要。メソッド名はお互いに複数形。belongsToMany。
テーブルは合計3つ必要。

中間テーブル作成。それぞれのテーブルの単数形(モデル名)をアルファベット順に並べる。

php artisan make:migration create_category_product_table --create=category_product

それぞれの中身。category_productがそれぞれのテーブルの_idを持つ。これでProduct、Categoryどちらからも呼び出せる。

テーブル
products
    id - integer
    name - string

categories
    id - integer
    name - string

category_product
    category_id - integer
    product_id - integer

メソッド名はお互いに複数形。

Product.php
class Product extends Model
{
    public function categories()
    {
        return $this->belongsToMany(Category::class);
    }
}
Category.php
class Category extends Model
{
    public function products()
    {
        return $this->belongsToMany(Product::class);
    }
}

attachdetachsync メソッドなどが使える。

Have a good relationship with relationships.

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?