Подзапрос в From Doctrine 2Php

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Подзапрос в From Doctrine 2

Сообщение Anonymous »

Я очень старался разобраться в этом сам, но не нашел решения. Итак, начнем!
У меня есть две сущности с доходом и стоимостью, и они прикреплены к третьей сущности под названием Project::class
< ол>
[*]Invoice::amount() (доход)
[*]SupplierInvoice::amount() (стоимость)

Моя цель — отфильтровать все проекты, имеющие отрицательный результат. И вычислите этот результат.
  • Поэтому я делаю один запрос, который разбивает мои проекты на разделы по 20 страниц, где я отображаю результат для каждой строки.
  • И еще один, где я подсчитываю полный результат и показываю его на карточке. то есть результат: -10.000$
Вот SQL, который хорошо работает как «собственный» запрос. Но я не могу понять, как написать это в Doctrine 2.

ВАЖНО!

«Основной» запрос — это тот, который управляет какие проекты я изучаю, поскольку есть еще около 8 фильтров, которые применяются в разных сценариях. Насколько мне известно, в запросе нет другого места, где я мог бы написать свой подзапрос
  • Версия PHP: 8.1
  • Версия MySQL: 8.0
  • Версии доктрины:

    "doctrine/orm": "^2.6",
  • "doctrine/migrations": "^2.3",

SELECT
SUM(
(
SELECT SUM(i.amount) AS invoice i
FROM invoice i
WHERE i.project_id = p.id
)
) AS income,
SUM(
(
SELECT SUM(si.amount) AS supplier_invoice si
FROM supplier_invoice si
WHERE si.project_id = p.id
)
) AS cost

FROM project p

WHERE p.id IN (
SELECT p20.id FROM (
SELECT
p10.id,
SUM(
(
SELECT SUM(i.amount) AS invoice i
FROM invoice i
WHERE i.project_id = p10.id
)
) AS inner_income,
SUM(
(
SELECT SUM(si.amount) AS supplier_invoice si
FROM supplier_invoice si
WHERE si.project_id = p10.id
)
) AS inner_cost
FROM project p10

GROUP BY p10.id
HAVING inner_cost > inner_income
) p20
);


Вот простой тест, чтобы проверить, смогу ли я вообще написать что-то вроде этого. Теперь это сработало. Ошибка
public function queryBuilderForEconomyNegativeWhatever(?callable $build_callback = null): callable {
return function(QueryBuilder $qb) use ($build_callback): void {
$expr = $this->entity_manager->getExpressionBuilder();
$qb->andWhere(
$expr->in('pi.id', sprintf('(
SELECT p20.id FROM (
SELECT
p10.id
FROM %s p10
WHERE p10.id > 500
) p20
)', Project::class))
);
if ($build_callback !== null) {
$build_callback($qb);
}
};
}

Doctrine \ ORM \ Query \ QueryException
[Semantical Error] line 0, col 1928 near 'FROM ( SELECT p10.id FROM': Error: Subquery is not supported here

Я также пытался создать пользовательскую функцию в Doctrine 2.
Вот мой пример:


Подробнее здесь: https://stackoverflow.com/questions/790 ... doctrine-2
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»