Sql для построителя запросов - Symfony

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

 SELECT
 DATE(transaction_date) AS TransactionDate, 
 SUM(amount) AS Amount
 FROM transaction
 WHERE type = 'spend'
 AND transaction_date>=  DATE_ADD(NOW(), INTERVAL -7 DAY)
 GROUP BY TransactionDate

Когда я запускаю свой sql-запрос, он работает нормально, но я могу ошибаться в своей функции, которую написал в Symfony. Он возвращает значение null, чего нельзя сказать о приведенном выше запросе.

 public function getWeeklyTrans()
{
    $date = date('Y-m-d h:i:s', strtotime("-7 days"));

    $result = $this->getAmountRepository()
        ->createQueryBuilder('p')
        ->select('sum(abs(p.amount))')
        ->where('p.transactionDate BETWEEN :today AND :n7days')
        ->setParameter('today', date('Y-m-d h:i:s'))
        ->setParameter('n7days', $date)
        ->getQuery()
        ->getArrayResult();

    return $result;

}

запросы не совсем то же самое - у одного есть дополнительный столбец и группа по, и используется> - = вместо BETWEEN. Так что, похоже, меньше о синтаксисе Symfony и больше о составе самого запроса ...

ADyson 20.11.2018 15:04

Я не на 100% знаком с конструктором запросов, но не следует ли вам использовать ->execute() в конце вместо ->getArrayResult()?

Dirk Scholten 20.11.2018 15:04

Может быть, но здесь нет логики. @Dirk

Jhonas 20.11.2018 15:07

У меня проблема с преобразованием. Я вижу разницу. :( @ADyson

Jhonas 20.11.2018 15:09

а что мешает вам перейти с BETWEEN на> =? А что вам мешает выбрать другое поле? А что вам мешает добавить группу? Вы проверяли документацию по построителю запросов? Это все простые вещи, там должны быть примеры.

ADyson 20.11.2018 15:10

попробуйте использовать BETWEEN :n7days AND :today

Matteo 20.11.2018 15:22

Все тот же результат. @Matteo

Jhonas 20.11.2018 15:27

вы скучаете по условию type = 'spend'

Matteo 20.11.2018 15:37
Стоит ли изучать 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
8
70
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Разве вы не можете получить SQL из построителя запросов и сопоставить его со своим рабочим запросом? Что-то вроде $qb->getQuery()->getSQL()?

Кажется, пропущено несколько условий

  • type = 'spend'

  • transaction_date>= DATE_ADD(NOW(), INTERVAL -7 DAY) не совсем то же состояние

  • GROUP BY TransactionDate тоже отсутствует.

Большое спасибо. Я нашел решение.

 public function getTrans()
{
    $type = Transaction::TYPE_SPEND;

    $result = $this->getAmountRepository()
        ->createQueryBuilder('p')
        ->select('sum(p.amount)')
        ->where('p.transactionDate >= :end')
        ->andWhere('p.type >= :type')
        ->setParameter('end', new \DateTime('-7 days'))
        ->setParameter('type', $type)
        ->groupBy('p.transactionDate')
        ->getQuery()
        ->getResult();

    return $result;
}

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