Как выполнить математическое выражение в queryBilder->addSelect()

#symfony #orm #query-builder #dql

Вопрос:

Мне нужно разделить некоторые числа, мой DQL:

 $q
    ->addSelect("({$subDQL->getDQL()})")
    ->addSelect("calculated_sum/e.total AS available")
 

Первый addSelect возврат calculated_sum правильный, но вторая addSelect ошибка броска.

 for:
->addSelect("calculated_sum/i.total AS available")
->addSelect($q->expr()->quot("billing_paid", "pd.total") ." AS available")

error is:
Expected Doctrine\ORM\Query\Lexer::T_FROM, got '/'
 
 for:
->addSelect("QUOT(billing_paid, pd.total) AS available")

error is:
Expected known function, got 'QUOT'
 

available это значение, которое изменяется от 0 до 1, когда 1 полностью доступен, а менее 1 частично доступно, а 0 недоступно.

Комментарии:

1. Вы уверены, что ошибка не в ->addSelect("calculated_sum/i.total AS available") том, что это единственное место, где вы используете / . Если это нормально , попробуйте изменить ->addSelect($q->expr()->quot("billing_paid", "pd.total") ."AS available") на ->addSelect($q->expr()->quot("billing_paid", "pd.total") ." AS available") , возможно, это единственное пространство приводит к сбою запроса.

2. @alexcm tnx, но эта ошибка была при копировании сюда, но моя ошибка заключалась в том, что я использовал неправильную логику, calculated_sum необходимо определить в основном запросе, а не в подзапросе и других, которые невозможно использовать переменную от 1 addSelect в другом, ошибка в MySQL.

Ответ №1:

Не вводите ошибку, php но MySql вводите , потому calculated_sum что она не определена при вызове во втором выборе:

 $q
    ->addSelect("({$subDQL->getDQL()}) AS HIDDEN calculated_sum")
    ->addSelect("(calculated_sum/e.total) AS HIDDEN available")
 

Правильный:

 $subDQL_cs = $this->_em->createQueryBuilder()
            ->select('SUM(p.price)')...

$subDQL_a = $this->_em->createQueryBuilder()
            ->select('SUM(p.price)/e.total')...

$q
    ->addSelect("({$subDQL_cs->getDQL()}) AS HIDDEN calculated_sum")
    ->addSelect("({$subDQL_a->getDQL()}) AS HIDDEN available")
 

Примечание

что сломать getSingleScalarResult() его необходимо, чтобы использовать getSingleResult()[1]