はじめに
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対多の場合
こんな関連
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');
}
}
多対多の場合
こんな関連
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');
}