【问题标题】:Fatal error: Maximum function nesting level of '100' reached, aborting致命错误:达到“100”的最大函数嵌套级别,正在中止
【发布时间】:2013-02-25 00:47:31
【问题描述】:

我有这个实体:

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:

$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)
    )
));

我收到错误消息:致命错误:达到“100”的最大函数嵌套级别,正在中止!

我该如何编写这个查询?

【问题讨论】:

    标签: symfony doctrine-orm query-builder


    【解决方案1】:

    我会这样做:

    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
    

    【讨论】:

    • 也是我的方式,但是doctrine2不支持这个功能。
    • 啊,对不起。那不是我的sql。你能摆脱部分费用和计划费用之间的联系吗?但是,您可以简化它应该会有所帮助。
    猜你喜欢
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    • 2014-12-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-29
    相关资源
    最近更新 更多