2012-08-21 4 views
0

У меня есть эти объекты:Фатальная ошибка: Максимальный уровень вложенности функции от «100» достигла, прерывание

Invoice hasMany PlannedCharge 
PlannedCharge hasMany PartialCharge 

мне нужно знать, если счет-фактура полностью оплачена, как это делает следующий SQL:

SELECT 
    Invoice.id 
FROM 
    webfactory_sale_invoices Invoice 
    AND 
     0 <> 
     ((SELECT 
      SUM(PlannedCharge.ammount) 
     FROM 
      webfactory_sale_planned_charges PlannedCharge 
     WHERE 
      PlannedCharge.invoice_id = Invoice.id 
     GROUP BY Invoice.id) - IFNULL((SELECT 
      SUM(PartialCharge.ammount) 
     FROM 
      webfactory_sale_planned_charges PlannedCharge 
       INNER JOIN 
      webfactory_sale_partial_charges PartialCharge ON PlannedCharge.id = PartialCharge.planned_charge_id 
     WHERE 
      PlannedCharge.invoice_id = Invoice.id 
     GROUP BY Invoice.id), 0)) 

Теперь, переводя DQL через QueryBuilder с этим способом:

$qb->andWhere($qb->expr()->neq(0, $qb->expr()->diff(
    $qb->select('SUM(PlannedCharge.ammount)') 
      ->from('WebFactorySaleBundle:PlannedCharge', 'PlannedCharge') 
      ->where("PlannedCharge.invoice = {$invoiceAlias}") 
      ->groupBy($invoiceAlias) 
      , 
    $qb->select('SUM(PartialCharge.ammount)') 
      ->from('WebFactorySaleBundle:PlannedCharge', 'PlannedCharge') 
      ->innerJoin('WebFactorySaleBundle:PartialCharge', 'PartialCharge') 
      ->where("PlannedCharge.invoice = {$invoiceAlias}") 
      ->groupBy($invoiceAlias) 
    ) 
)); 

я получаю сообщение об ошибке: Fatal эр ror: Максимальный уровень вложенности функции «100» достигнут, прерывается!

Как я могу написать этот запрос?

ответ

0

Я хотел бы сделать это примерно так:

SELECT 
    i.id, sum_planned, sum_partial, sum_planned - ifnull(sum_partial,0) AS saldo 
FROM 
    (SELECT id 
    FROM webfactory_sale_invoices 
    GROUP BY id 
    ) i LEFT OUTER JOIN 
    (SELECT 
     id, SUM(ammount) AS sum_planned 
    FROM 
     webfactory_sale_planned_charges 
    GROUP BY 
     id) pl ON 
     i.id = pl.id LEFT OUTER JOIN   
    (SELECT 
     id, SUM(ammount) AS sum_partial 
    FROM 
     webfactory_sale_partial_charges 
    GROUP BY 
     id) pa ON i.id = pa.id 
+0

Это мой путь тоже, но doctrine2 не поддерживают эту функцию. –

+0

ах, sry. а не мой sql. Можете ли вы избавиться от участия в частичных и плановых сборах? Однако вы можете упростить его, это должно помочь. – Beth