My User
エンティティはUserInterface
を実装しており、したがってgetRoles()
メソッドを提供しています。私のシステムでは、User
は複数のGroup
に属します。グループは複数のロールを持つことができます。したがって、ユーザーの役割は、すべてのグループを収集し、それらのグループの役割のリストをマージすることによって判断できます。 FOSUserBundleと同じことが可能です。Symfony2:ユーザエンティティのグループの役割を取得しますが、エンティティ内のクエリは避けてください
最も簡単なアルゴリズムは次のようになります。
public function getRoles()
{
$roles = $this->roles;
foreach ($this->getGroups() as $group) {
$roles = array_merge($roles, $group->getRoles());
}
return array_unique($roles);
}
私はそれがひどく拡大するので、この解決策には問題があると思います。グループごとに新しいクエリーを実行する必要があるため、クエリーの量はグループの数によって異なります。
私は通常、ユーザーのすべてのグループを収集し、グループの役割に参加する単一のクエリを定義することでこれを解決します。その場合、User
エンティティからUserRepository
(または直接Doctrineクエリを作成する)を呼び出す必要があり、それは悪い習慣だと私は信じています。
したがって、単一の結合クエリのパフォーマンス上の利点を維持しながら、この悪い習慣を回避するにはどうすればよいですか?
(今回は他の類似した状況があるかどうかはわかりませんが、通常そういう方法をリポジトリに提供するのでこの場合、UserInterface
はエンティティ内に存在する必要があります)