symfony4 с doctrine-odm: как добавить одну или несколько групп в построитель агрегации - PullRequest
0 голосов
/ 25 января 2019

Я конвертирую монго-запросы в ODM-запросы доктрины symfony4. При этом доктрина не будет принимать множественную группу по полям. Как решить приведенный ниже вариант использования?

Монго Запросы:

db.Article.aggregate([
    {
        $group: {
            _id: { department: "$department", status : "$status" },
            MIN: { $min: "$salary" },
            MAX: { $max: "$salary" }
        }
    }
]);

Результаты запроса Монго:

{ "_id" : { "department" : "sales", "status" : 0 }, "MIN" : 100, "MAX" : 5000 }
{ "_id" : { "department" : "sales", "status" : 1 }, "MIN" : 10000, "MAX" : 16500 }
{ "_id" : { "department" : "IT", "status" : 1 }, "MIN" : 5000, "MAX" : 5000 }
{ "_id" : { "department" : "DOCTOR", "status" : 1 }, "MIN" : 20000000, "MAX" : 20000000 }
{ "_id" : { "department" : "IAS", "status" : 1 }, "MIN" : 120000, "MAX" : 120000 }

Symfony4 с доктриной odm:

$qb = $this->createAggregationBuilder($documentClass);
$qb
    ->group()
        ->field('id')
        ->expression('$department')
        ->field('department')
        ->first('$department')
        ->field('status')
        ->first('$status')
        ->field('lowestValue')
        ->min('$salary')
        ->field('highestValue')
        ->max('$salary')
        ->field('totalValue')
        ->sum(1);

Будет рассматриваться только группа по областям отдела. Я хочу сгруппировать результаты по отделам и статусам.

1 Ответ

0 голосов
/ 28 января 2019

Это решение работает с Symfony 3. В файле ArticleRepository.php напишите следующие строки:

$qb = $this->createAggregationBuilder('Document\Article');
$group_expression = $qb->expr()
                       ->field('departement')
                       ->expression('$department')
                       ->field('max')
                       ->expression('$max')
                       ->field('min')
                       ->expression('$min');
$qbf->group()
    ->field('id')
    ->expression($group_expression)
    ->field('department')
    ->first('$department')
    ->field('status')
    ->first('$status')
    ->field('lowestValue')
    ->min('$salary')
    ->field('highestValue')
    ->max('$salary')
    ->field('totalValue')
    ->sum(1);
...