Используйте QueryBuilder Doctrine, чтобы получить категории с минимальным количеством продуктов - PullRequest
0 голосов
/ 05 мая 2020

Я хочу использовать QueryBuilder Doctrine для получения категорий с указанным атрибутом и минимальным количеством продуктов внутри. Я уверен, что впервые использую эту функцию Doctrine. Я обнаружил это и понял, что это намного мощнее, чем базовые функции репозиториев. Я очень новичок с SQL, потому что раньше я использовал функции репозитория.

Но я думаю, что добился этого в чистом виде SQL:

SELECT category.*,COUNT(*)
FROM category_product 
INNER JOIN category ON category_product.category_id = category.id 
WHERE category.name = 'region' 
GROUP BY category_product.category_id HAVING COUNT(*) > 20

На данный момент я ' m полностью потеряно с построением DQL. Мои сущности категории и продукта имеют отношение "многие ко многим", и я не могу связать это с Doctrine. Я пробовал использовать таблицу category_product, автоматически созданную doctrine, но она не хочет получать доступ к этой таблице ...

        $qb = $this->createQueryBuilder('c');

        $qb
            ->select('c')
            ->where("c.name = 'region'")
            ->innerJoin('c.products', 'p', 'WITH', 'COUNT(c.products) > :minimum')
            ->setParameter('minimum', $minimum);

        dump($qb->getQuery(), $qb->getQuery()->getResult());


Каждый раз, когда я использую новую конструкцию, у меня возникают семантические ошибки I ' м не могу исправить ...

Большое спасибо за вашу помощь

Ответы [ 2 ]

0 голосов
/ 06 мая 2020

Хорошо. Благодаря тебе я понял.

Мне не следует выбирать COUNT, потому что я набрал return как массив категорий, но он вернул массив массивов, содержащий категорию и количество ... Мне также пришлось сгруппировать по c .

Большое спасибо за вашу помощь!

Ответ:

        $qb = $this->createQueryBuilder('c')
            ->select('c')
            ->where('c.name = :region')
            ->innerJoin('c.products', 'p')
            ->groupBy('c')
            ->having('SIZE(c.products) > :minimum')
            ->setParameter('region', $region)
            ->setParameter('minimum', 20);
0 голосов
/ 06 мая 2020

Вы можете попробовать что-нибудь вроде здесь (фрагмент кода из моей рабочей модели)

$qb = $this->createQueryBuilder('c')
        ->select('c')
        ->where('c.name = region')
        ->addSelect('COUNT(c.products) AS counter')
        ->innerJoin('c.products', 'p')
        ->groupby('p.id')
        ->having('count(p.id) >= :minimum')
        ->setParameter('region', $region)
        ->setParameter('minimum', $minimum)
      ;

    dump($qb->getQuery()->getResult());

связанное сообщение: здесь

...