11
8

More than 3 years have passed since last update.

LaravelのEloquent ORMでどっちがhasでどっちがbelongsなのか?

Posted at

はじめに

LaravelのEloquent ORMでは、Modelに対してhasOne、hasMany、belongsTo、belongsToManyを定義することにより、Model間の関連を表すことが出来ます。
主従(親子)関係より、主(親)となる側にhasOne、hasManyを定義し、従(子)となる側にbelongsToを定義すれば良いのですが、初心者の方には主従関係の見極めが難しいので、どっちにhasを定義し、どっちにbelongsToを定義するのかの決め方をまとめてみました。

どっちがhasかbelongかの決め方

  • 1対1の場合
    • テーブル構造において、相手のidのカラムを持っているModelにbelongsToを定義し、他方のModelにhasOneを定義する。
  • 1対多の場合
    • テーブル構造において、相手のidのカラムを持っているModelにbelongsToを定義し、他方のModelにhasManyを定義する。
  • 多対多の場合
    • 両方のModelにbelongsToManyを定義する。

Laravelの関連の定義

LaravelのModelでの関連の定義については、以下をご参照ください。

1対多の場合

こんな関連

1.png

Modelの定義

productsテーブルにmaker_idが存在するので、ProductモデルにbelongsToを定義する。

class Product extends Model
{
    public function maker()
    {
        return $this->belongsTo('App\Maker');
    }
}

他方のMakerモデルにhasManyを定義する。

class Maker extends Model
{
    public function products()
    {
        return $this->hasMany('App\Product');
    }
}

多対多の場合

こんな関連

2.png

Modelの定義

両方のModelにbelongsToManyを定義する。

class Product extends Model
{
    public function categories()
    {
        return $this->belongsToMany('App\Category');
    }
}
class Category extends Model
{
    public function products()
    {
        return $this->belongsToMany('App\Product');

}
11
8
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
11
8