Как добавить столбец в построителе запросов Symfony по умолчанию - PullRequest
1 голос
/ 15 мая 2019

Я новичок в Symfony, и у меня проблема с существующим приложением, которое я поддерживаю.

В одном из репозиториев есть метод выбора неудачных транзакций и соответствующего платежа.

Теперь они попросили меня разрешить фильтровать транзакции на основе общего количества неудачных транзакций, которое может быть либо 1 неудачной транзакцией, либо 2.

Что я пытаюсьсделать в построителе запросов, что-то вроде этого:

$this
    ->createQueryBuilder('t')
    ->join('t.payment', 'p')
    ->leftJoin( Transaction::class, 'tr', Query\Exprt\Join::WITH, 'p.id = tr.payment')
    ->groupBy('tr.id');

До этого момента все в порядке.Запрос выполняется нормально, и я вижу нужные мне транзакции.

Теперь проблема в том, что я не могу использовать следующий оператор:

$this
    ->createQueryBuilder('t')
    // This is the column I need to insert
    ->addSelect('COUNT(tr.id) AS TotalRecords')
    ->join('t.payment', 'p')
    ->leftJoin( Transaction::class, 'tr', Query\Exprt\Join::WITH, 'p.id = tr.payment')
    ->groupBy('tr.id');

Поскольку выходные данные выглядят так:

array:1 [▼
  0 => array:2 [▼
    0 => Transaction {#1221 ▶}
    "TotalRecords" => "1"  <- This is the total transactions number I need
  ]
]

Вместо вышеприведенного вывода мне нужно иметь TotalRecords внутри объекта Transaction.

Итак, есть ли способ добиться этого с помощью построителя запросов?Вы думаете, я что-то не так делаю?

1 Ответ

1 голос
/ 15 мая 2019

Вы можете просто зациклить свой набор результатов и установить TotalRecords для всех объектов Transaction ... и вернуть массив транзакций, как вы, вероятно, надеялись.Затраты минимальны, но стандартная гидрация доктрины недостаточно умна

// the following is your query:
$qb = $this
    ->createQueryBuilder('t')
    ->addSelect('COUNT(tr.id) AS TotalRecords')
    ->join('t.payment', 'p')
    ->leftJoin( Transaction::class, 'tr', Query\Exprt\Join::WITH, 'p.id = tr.payment')
    ->groupBy('tr.id');

// fetch the results, and instead of straight returning them, "merge"
$results = $qb->getQuery()->getResult();
$return = [];
foreach($result as $row) {
    $row[0]->totalCount = $row['TotalCount'];
    $return[] = $row[0];
}
return $return; // <-- now an array of Transaction

, вы также можете просто не использовать addSelect, а вместо этого having и просто использовать количество транзакцийвы хотите фильтровать по параметру (если фильтрация не будет выполнена позже, в этом случае этот подход не будет работать)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...