Как выбрать данные с помощью построителя запросов, когда есть отношения «многие ко многим»?

Я использую Symfony 3.2 и Doctrine Query Builder. У меня есть отношение ManyToMany между (Пользователи<->roles_users<->Роли)

пользователи (идентификатор), roles_users(role_id, user_id) и роли (идентификатор, имя).

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
167
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

Большое спасибо. Это работает довольно хорошо для меня. А как же без абстракции? Как бы это выглядело?

Madji 12.04.2019 13:29
Ответ принят как подходящий

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) полностью прозрачна!

Большое спасибо. Это работа для меня. До сих пор я не мог найти хорошего объяснения того, как это работает. А как же без абстракции? Как бы это выглядело?

Madji 12.04.2019 13:26

Я называю это абстракцией, потому что вам не нужно заботиться о таблице соединений, которой управляет Doctrine. Вместо этого вы должны рассматривать только свои объекты и их отношения. В этом разница между SQL и D(octrine)QL, которая позволяет вам управлять объектами вместо таблиц.

Florian Hermann 12.04.2019 13:54

Другие вопросы по теме