以前ここで、多対多のテーブルでの検索方法を質問させてもらいました。
https://teratail.com/questions/124951
内容的には、
users
roles
role_user
という3つのテーブルで構成されており、
あるroleを持つユーザだけを取得するにはどうすればよいかというものでした。
回答としては
->join('role_user', 'users.id', '=', 'role_user.user_id') ->whereIn('role_user.role_id', $roles) ->havingRaw('COUNT(users.id) = ' . count($roles)) ->groupBy('users.id')
このように、joinし、user.idでグループ化した時の件数と、検索対象のroleの件数が一致するれば、ユーザを取得する方法がありました。
上記のように3つのテーブルではこれで良いかと思うのですが、
例えば、
roles以外にcategoriesが増え、
category_userテーブルで新たに多対多の関係を作った時、
rolesとcategoriesの両方の検索を行う方法が分かりません。
以下の方法で試しましたが、
$users = User::all(); // roleの絞込 $users = $users->join('role_user', 'users.id', '=', 'role_user.user_id') ->whereIn('role_user.role_id', $roles) ->havingRaw('COUNT(users.id) = ' . count($roles)) ->groupBy('users.id') // categoryの絞込 $users = $users->join('category_user', 'users.id', '=', 'category_user.user_id') ->whereIn('category_user.category_id', $categories) ->havingRaw('COUNT(users.id) = ' . count($categories)) ->groupBy('users.id')
roleで絞り込んだ中からcategoryで絞りこめるかと思いましたが、この方法では絞込ができませんでした。
何か良い方法はありませんでしょうか?
あなたの回答
tips
プレビュー