質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

2回答

4660閲覧

Laravelの多対多のリレーションで、複数のユーザのうち、特定のロールに紐づくユーザ一覧の取得

退会済みユーザー

退会済みユーザー

総合スコア0

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

1クリップ

投稿2018/05/06 08:08

編集2018/05/06 08:54

https://readouble.com/laravel/5.1/ja/eloquent-relationships.html
こちらで紹介されているように多対多のリレーションを試しました。

ユーザには複数のロールが結びつき
ロールには複数のユーザが結び付く

このようなとき以下のテーブル構成にすると思います。

users
roles
role_user

例えば、特定のロールに紐づくユーザ一覧だと、以下で取得できるかと思います。

$role = Role::find(1); $users = $role->users();

しかし、特定の複数のユーザのうち、特定のロールに紐づくユーザを検索する時、方法が思い浮かびません。

// 3名のユーザを取得 $users = User::find([1,2,3]); // 検索条件にしたロールを取得 $role = Role::find(1); // 3名のユーザうち、検索条件のロールを持っているユーザを取得 $users = $user->where(.....)

このwhere内でなんとか検索できるものなのか、そもそもそういう検索方法はないのでしょうか?


検索方法が分かりました。

$users = Employee::whereHas('roles', function ($query) { $query->whereIn('role_id', [10,11,12]); }) ->get();

このようにして取ることが出来ましたが、role_idが10,11,12のもだけを取得が出来ません。
上記の例だと、10,11,12のどれかのroleを持っているユーザであれば取得可能です。

whereInの代わりに、whereを使うと、変な挙動となります。
例えば、あるユーザのロールが10,11で、
検索条件には、10,11,12としている場合ヒットします。
また、あるユーザのロールが11,12だった場合にはヒットしなくなります。
どうやらロールの先頭から評価していっているようです。

どうすれば、ロールを10,11,12を持つユーザを取得できるのでしょうか?
完全一致の場合のみ取得したいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

完全一致の場合 whereIn() と havingRaw() の組み合わせで実現できそうです。
部分一致した結果の内、その数が条件となるroleの数と一致しているものが完全一致となります。

php

1// $roles には [1, 2, 3] が入っているものとします 2->join('role_user', 'users.id', '=', 'role_user.user_id') 3->whereIn('role_user.role_id', $roles) 4->havingRaw('COUNT(users.id) = ' . count($roles)) 5->groupBy('users.id')

Toxi法のAND検索のケースが参考になるかと思います。

参考サイト
https://colo-ri.jp/develop/2012/02/tag-database-schema-methods.html#toxi

only_full_group_by 関係のエラーが出る場合 config/database.php の mysql にある strict を false にします。

投稿2018/05/07 08:21

編集2018/05/07 08:48
workr

総合スコア158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

以下のような感じでいけないでしょうか。

$users = Employee::whereHas('roles', function ($query) { $query->where('role_id', 10); })->whereHas('roles', function ($query) { $query->where('role_id', 11); })->whereHas('roles', function ($query) { $query->where('role_id', 12); })->get();

投稿2018/05/06 12:09

Lulucom

総合スコア1899

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問