Как выбрать данные с помощью построителя запросов, когда отношения имеют много ко многим? - PullRequest
0 голосов
/ 12 апреля 2019

Я использую Symfony 3.2 и Doctrine Query Builder.У меня есть отношения ManyToMany (Users <-> role_users <-> Roles)

пользователей (id), role_users (role_id, user_id) и ролями (id, name).

И хотите выбрать только тех пользователей, где role.name = 'role_client'.Как это сделать с помощью построителя запросов?

Ответы [ 2 ]

1 голос
/ 12 апреля 2019

Вы можете создать такой метод в своем пользовательском репозитории:

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' , поскольку я не знаю, как вы назвали ее в своей сущности User.

0 голосов
/ 12 апреля 2019

Doctrine позволяет делать абстракцию базы данных. Вы должны думать не с таблицей базы данных, а с сущностью: ваша сущность User должна иметь свойство $ role (или, возможно, имя 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();
}

Я выполнил объединение для свойства $ role объекта User: таблица соединений (здесь role_users) полностью прозрачна!

...