Laravelで、単一テーブル継承(STI)を簡単に実現
単一テーブル継承の理解が間違っていたらごめんなさい。
Laravel 5.2 から、 Global scope
という機能が使えるようになった。
これにより、全てのクエリに自動的に条件を追加できるため、クラスの継承を使い、同一のテーブルを性質に分けて実装することが可能。
例えば、Q&Aサイトなどで、投稿(posts
) の種類として 記事(article
) と 質問(question
) に分けられるとする。
posts
は tags
や users
と関連があり、その処理は共通化したいため一つのテーブルに収めたい。
article
と question
には固有の処理を持たせたい。
こんな状況だと
class Article extends Post
{
protected $table = 'posts';
protected static function boot()
{
parent::boot();
static::addGlobalScope('article', function (Builder $builder) {
$builder->where('type', 'article');
});
}
}
これにより、 where type = 'article'
が全ての Article
が発するクエリに付加される。
>>> App\Article::where('id', 1)->toSql()
=> "select * from `posts` where `id` = ? and `type` = ?"
実際、Laravelの提供する SoftDeletes
トレイトもほぼ同じように実装されている(らしい)。
Author And Source
この問題について(Laravelで、単一テーブル継承(STI)を簡単に実現), 我々は、より多くの情報をここで見つけました https://qiita.com/acro5piano/items/95ad47acd17f8a5a5b4c著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .