У меня есть отношение ManyToMany от пользователей и ролей. То есть у меня есть таблица пользователя и класс сущности, таблица ролей и сущность и таблица объединения user_role width_ user_id и role_id.
Теперь я недавно попытался получить пользователей с их ролями, используя объединения, например:
$qb = $this->createQueryBuilder('u') ->join('user_role', 'ur', Join::ON, "I didn't know what to put here, nothing worked ")
Во всяком случае, благодаря этому ответу я добавил правильное сопоставление (аннотации) к моим обеим классам сущностей, а затем удалил свое собственное соединение, позволяя Doctrine выполнять работу:
$qb = $this->createQueryBuilder('u'); $q = $qb->getQuery(); $users = $q->getResult();
И это работает. У меня есть список всех пользователей, а затем я могу получить доступ к их ролям (благодаря методу User-> getRoles ()).
Однако теперь я хочу указать только пользователей, имеющих определенные роли, например «ROLE_ADMIN», и я понятия не имею, как это сделать:
$qb = $this->createQueryBuilder('u') >where('what_to_put_here = :roles') ->setParameter('roles', 'what_to_put_here')
Кстати, код SQL, созданный Doctrine, выглядит так:
SELECT u0_.id AS id_0, u0_.username AS username_1, u0_.personal_name AS personal_name_2, u0_.password AS password_3, u0_.email AS email_4, u0_.is_active AS is_active_5 FROM user u0_
Таким образом, нет ПРИСОЕДИНЕНИЯ. Из документов Doctrine я знаю, что это называется «ленивой нагрузкой» – роли определенного пользователя будут получены по требованию.
Но тогда, как я могу сделать что-то вроде этого:
SELECT * FROM `user` JOIN user_role on user_role.user_id = user.id JOIN role on role.id = user_role.role_id WHERE role.role_name = 'ROLE_ADMIN'
?
Использовать это:
$qb = $this->createQueryBuilder('u') ->innerJoin('u.roles', 'r') ->where('r.roleName = :roleNameParameter') ->setParameter('roleNameParameter', 'ROLE_ADMIN');
Я предполагаю, что вы сопоставили имя role_name в качестве свойства roleName в сущности.