Я новичок в 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 объекта.
Итак, есть ли способ добиться этого с помощью построителя запросов? Вы думаете, я делаю что-то не так?
Большое спасибо @Cerad. Но я не могу сделать это изменение, так как проект не на 100% мой. Они просто попросили меня выполнить это уникальное изменение :(. В любом случае, большое спасибо !! :)






вы можете просто перебрать свой набор результатов и установить TotalRecords для всех объектов транзакций... и вернуть массив транзакций, как вы, вероятно, и надеялись. Накладные расходы минимальны, но стандартная гидратация доктрины недостаточно умна.
// 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 и просто использовать количество транзакций, которые вы хотите отфильтровать, в качестве параметра (если только фильтрация не будет выполнена позже, и в этом случае этот подход не будет работать)
По умолчанию Doctrine плохо справляется с добавлением настраиваемых полей в сущность или с вычисляемыми полями в целом. Вам следует взглянуть на нативная функциональность, который в основном позволяет вам настраивать сопоставление данного запроса с данным объектом. Это хорошо работает в простых случаях.