Doctrine Запрос, сколько раз сущность появляется на другой таблице - PullRequest
0 голосов
/ 05 апреля 2019

Предположим, у меня есть две таблицы:

Customer
id | name
1  | John
2  | Chris

Sales
id | client_id | price
1  | 1         | 100
2  | 1         | 200
3  | 1         | 300
4  | 2         | 150
5  | 2         | 250

Соотношение между таблицами равно 1: M

Как должен выглядеть мой запрос, если я хочу вернуть данные ниже?

client_name | number of sales
John        | 3
Chris       | 2

Прямо сейчас мой построитель запросов выглядит следующим образом: просто выберите *

$objs = $this->getDoctrine()->getManager()
                    ->getRepository(Customer::class)
                    ->createQueryBuilder('obj');

            $objs = $objs->getQuery()->getResult();

Должен ли я использовать какое-либо соединение или подзапрос?Я был бы признателен за небольшое руководство, спасибо.

Ответы [ 3 ]

2 голосов
/ 06 апреля 2019

В основном то, что написал @Arno Hilke, но с некоторыми изменениями (и при условии, что ваша Customer сущность на самом деле называется Client):

$query = $this->getDoctrine()->getManager()
    ->getRepository(Client::class)
    ->createQueryBuilder('c')
    ->select('c.name as client_name, COUNT(s.client) as number_of_sales')
    ->join('c.sales', 's')
    ->groupBy('s.client')
    ->getQuery();

$result = $query->getArrayResult();
1 голос
/ 05 апреля 2019

Присоединяйтесь к вашему столу продаж.Сгруппируйте по клиентам и посчитайте вхождения каждого клиента.Нечто подобное должно работать, в зависимости от ваших точных определений сущностей:

$query = $this->getDoctrine()->getManager()
           ->getRepository(Customer::class)
           ->createQueryBuilder('customer')
           ->select('customer.id as id, count(customer.id) as number');
           ->join('customer.sales', 'sales')
           ->groupBy('sales');


$result = $query->getQuery()->getArrayResult();
0 голосов
/ 08 апреля 2019

Спасибо @Arno Hilke и @ Michał Tomczuk.

Я немного изменил код в соответствии со своими потребностями.Мне нужно было несколько условий в select, поэтому вместо COUNT я использовал SUM, код заканчивался так:

$query = $this->getDoctrine()->getManager()
              ->getRepository(Customer::class)
              ->createQueryBuilder('c')
              ->select("c.name, SUM(CASE WHEN s.conditioneOne = 'valueOne' AND s.conditionTwo = 'valueTwo' THEN 1 ELSE 0 END) AS number_of_sales")
                    ->join('c.sales', 's')
                    ->groupBy('s.costumer')
                    ->orderBy('number_of_sales', 'DESC');

$results = $query->getQuery()->getArrayResult();
...