Я использую Symfony 3.2 и Doctrine Query Builder. У меня есть отношение ManyToMany между (Пользователи<->roles_users<->Роли)
пользователи (идентификатор), roles_users(role_id, user_id) и роли (идентификатор, имя).
И хотите выбрать только тех пользователей, где roles.name = 'role_client'. Как это сделать с помощью конструктора запросов?






Вы можете создать такой метод в своем пользовательском репозитории:
public function findByRole($roleName='role_client')
{
$query = $this->createQueryBuilder('u')
->select('u')
->leftJoin('u.role', 'r')
->addSelect('r');
$query = $query->where('r.name = :rolename')
->setParameter('rolename', $roleName)
->getQuery()
->getResult();
return $query;
}
Но убедитесь, что ORM правильно создан между сущностями, чтобы вы могли легко соединить сущность «Роль» с сущностью «Пользователь».
Нос, что вам, возможно, придется изменить часть 'u.role', поскольку я не знаю, как вы назвали ее в своей сущности пользователя.
Doctrine позволяет вам сделать абстракцию базы данных. Вместо этого вы должны думать не о таблице базы данных, а об объекте: ваш объект User должен иметь свойство $roles (или, возможно, имя diffrenet), чтобы вы могли использовать его в своем queryBuilder следующим образом:
public function findByRoleName(string $roleName)
{
return $this
->createQueryBuilder('u')
// add this to also load the related roles entities
->addSelect('r')
// Where roles is your property name in the User entity
->leftJoin('u.roles', 'r')
->where('r.name = :roleName')
->setParameter('roleName', $roleName)
->getQuery()
->getResult();
}
Я выполнил соединение со свойством $roles объекта User: таблица соединений (здесь roles_users) полностью прозрачна!
Большое спасибо. Это работа для меня. До сих пор я не мог найти хорошего объяснения того, как это работает. А как же без абстракции? Как бы это выглядело?
Я называю это абстракцией, потому что вам не нужно заботиться о таблице соединений, которой управляет Doctrine. Вместо этого вы должны рассматривать только свои объекты и их отношения. В этом разница между SQL и D(octrine)QL, которая позволяет вам управлять объектами вместо таблиц.
Большое спасибо. Это работает довольно хорошо для меня. А как же без абстракции? Как бы это выглядело?