Doctrine queryBuilder - считать отношение OneToMany - PullRequest
0 голосов
/ 02 ноября 2019

У меня есть этот запрос

/**
 * @param $i
 * @return mixed
 * Returns all users except current logged in manager
 */
public function getUsersWithoutCurrent($i) {
    $qb = $this->createQueryBuilder('u');
    $qb->select('u.name')
        ->addSelect('u.email')
        ->addSelect('u.LastSeen')
        ->addSelect('u.slug')
        ->addSelect('u.roles')
        ->where($qb->expr()->notIn('u.id', ':usr'))
        ->setParameter('usr', $i);
    return $qb
        ->getQuery()
        ->getResult();
}

Но в то же время я хочу подсчитать для каждого пользователя связанные с ним сообщения в блоге

/**
 * @ORM\OneToMany(targetEntity="App\Entity\Blog", mappedBy="author", orphanRemoval=true)
 */
private $blogs;

Если я присоединяюсь к блогам, а затем попробуйтечтобы выбрать count () я получаю

SQLSTATE[42000]: Syntax error or access violation: 1140 In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column 'db.u0_.name'; this is incompatible with sql_mode=only_full_group_by

Это форматированный запрос

SELECT u0_.name AS name_0, u0_.email AS email_1, u0_.last_seen AS last_seen_2, u0_.slug AS slug_3, u0_.roles AS roles_4, COUNT(DISTINCT (b1_.id)) AS sclr_5 FROM user u0_ INNER JOIN blog b1_ ON u0_.id = b1_.author_id WHERE u0_.id NOT IN (?)' with params [37]

1 Ответ

0 голосов
/ 02 ноября 2019

Все, что мне нужно было сделать, это добавить groupBy:)

public function getUsersWithoutCurrent($i) {
    $qb = $this->createQueryBuilder('u');
    $qb->select('u.name')
        ->addSelect('u.email')
        ->addSelect('u.LastSeen')
        ->addSelect('u.slug')
        ->addSelect('u.roles')
        ->innerJoin('u.blogs', 'ub')
        ->setParameter('usr', $i)
        ->addSelect('COUNT(distinct(ub)) AS blogs')
        ->where($qb->expr()->notIn('u.id', ':usr'))
        ->groupBy('u.id')
    ;
    return $qb
        ->getQuery()
        ->getResult();
}
...