LoginSignup
8
4

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-05-29

やりたいこと

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