Как добавить столбец в построитель запросов Symfony по умолчанию

Я новичок в 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 объекта.

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

По умолчанию Doctrine плохо справляется с добавлением настраиваемых полей в сущность или с вычисляемыми полями в целом. Вам следует взглянуть на нативная функциональность, который в основном позволяет вам настраивать сопоставление данного запроса с данным объектом. Это хорошо работает в простых случаях.

Cerad 15.05.2019 14:40

Большое спасибо @Cerad. Но я не могу сделать это изменение, так как проект не на 100% мой. Они просто попросили меня выполнить это уникальное изменение :(. В любом случае, большое спасибо !! :)

KodeFor.Me 15.05.2019 14:44
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
2
131
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

вы можете просто перебрать свой набор результатов и установить 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 и просто использовать количество транзакций, которые вы хотите отфильтровать, в качестве параметра (если только фильтрация не будет выполнена позже, и в этом случае этот подход не будет работать)

Другие вопросы по теме