DQL-запрос с объединением таблицы и двумя объединениями - PullRequest
5 голосов
/ 16 декабря 2011

У меня есть 2 лица:

/**
 * @ORM\Entity
 * @ORM\Table(name="users")
 */
class User
{
    /**
     * @ORM\ManyToMany(targetEntity="Myapp\UserBundle\Entity\Group")
     * @ORM\JoinTable(name="user_groups",
     *      joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="group_id", referencedColumnName="id")}
     * )
     */
    protected $groups;

    ...
}

и

/**
 * @ORM\Entity(repositoryClass="Myapp\UserBundle\Repository\GroupRepository")
 * @ORM\Table(name="groups")
 */
class Group
  ...

Я не могу найти способ создать запрос DQL, который приводит к SQL, как это:

SELECT g.name, g.id, count( u.id )
FROM users u
LEFT JOIN user_groups ug ON u.id = ug.user_id
RIGHT JOIN groups g ON g.id = ug.group_id
GROUP BY g.id

Я пытался и потерпел неудачу с:

$this->getEntityManager()
    ->createQuery('
        SELECT g.id, g.name, count(u.id) as usercount FROM MyappUserBundle:User u
        JOIN u.groups g
        GROUP BY g.id'
    );

, поскольку результат не содержит групп, в которых нет пользователя.

1 Ответ

2 голосов
/ 16 декабря 2011

Это отношение ManyToMany, не пытайтесь объединить событие в таблице отношений, только связанный объект ... Тогда вы были правы с RIGHT JOIN ... для SQL-запроса, но Doctrine автоматически определяет тип соединения из предложения FROM.

В DQL только определенные отношения управляются присоединениями, поэтому вам не нужны предложения USE или ON ...

А как насчет этого?

SELECT g.name, g.id, count( u.id )
FROM groups g
JOIN users u
GROUP BY g.id
...