やりたいこと
・fugafuga2というタグを持っているpostを取得したい
・これを取るだけだとhasManyとかを適当に使うといいが、他のscopeと組み合わせたい
・fugafuga2を$request等から取得したい
前提
データモデルは以下のような構造とする(更新日時等は割愛)
posts
id | title | content |
---|---|---|
1 | タイトル1 | タイトル1\nタイトル1\nタイトル1 |
2 | タイトル2 | タイトル2\nタイトル2\nタイトル2 |
3 | タイトル3 | タイトル3\nタイトル3\nタイトル3 |
tags
id | quote |
---|---|
1 | hogehoge1 |
2 | fugafuga1 |
3 | hogehoge2 |
4 | fugafuga2 |
5 | hogehoge3 |
6 | fugafuga3 |
relation_posts_to_tags
id | post_id | tag_id |
---|---|---|
1 | 1 | 2 |
2 | 1 | 4 |
3 | 2 | 1 |
4 | 2 | 3 |
5 | 3 | 4 |
実装
クロージャのあとにuse ([引数])をすればOK
Model
public function scopeHasTagName($query, $tag_name)
{
// tag_nameを持っていない場合は処理せずreturn
if (empty($tag_name)) return $query;
return $query->whereIn('id', function ($query) use ($tag_name) {
return $query->select('post_id')
->from('relation_posts_to_tags')
->join('tags', 'relation_posts_to_tags.tag_id', '=', 'tags.id')
->where('tags.quote', '=', $tag_name);
});
}
Controller
$posts = Post::hasTagName('fugafuga2')