PHP
Laravel
scope
Query
laravel5.5

Laravelでscope内にサブクエリを使いたい、且つサブクエリ内に変数を渡したい場合

More than 1 year has passed since last update.


やりたいこと

・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')