在larawvel框架中的whereraw / where中使用SUM

时间:2016-12-08 08:25:09

标签: php mysql laravel

我的列名为PlanCost Discount AmountPaid,标签包含Due

在这里,我试图只显示PlanCost != AmountPaid

所在的行

这是我的整个查询

 $getID = isset($inputArray['id']) ? $inputArray['id'] : 0;
    $query = TelePlanSelect::join('tele_plan', 'tele_plan.id', '=', 'tele_plan_select.teleplan_id'  )
        ->leftjoin('tele_payment_defs', 'tele_payment_defs.telereg_id', '=', 'tele_plan_select.telereg_id')
        ->leftjoin('tele_payment_items', function ($join){
            $join->on('tele_payment_items.telepaymentdefs_id', '=', 'tele_payment_defs.id')
                ->on('tele_payment_items.teleplan_id', '=' ,'tele_plan.id');
        } )

        ->selectRaw('tele_plan.id as `PlanID`,' .
            'tele_plan.plan_name as `PlanName`,' .
            'tele_plan.plan_cost as `PlanCost`,' .
            'tele_plan.plan_details as `PlanDetails`,'.
            'sum(tele_payment_items.amount) as  `AmountPaid` ,'.
            'COALESCE(sum(tele_payment_items.discount),0) as `Discount`,'.
            '(COALESCE(tele_plan.plan_cost,0) -  sum(COALESCE(tele_payment_items.discount,0))) - sum(coalesce(tele_payment_items.amount, 0)) as  `Due` '

        )
        ->where('tele_plan_select.telereg_id', $getID)
        ->groupBy('tele_plan.id')
      ->where(' tele_plan.plan_cost', '!=', 'sum(tele_payment_items.amount)');

我不确定我们是否可以在sum中使用where/whereraw 有人能帮助我吗?

编辑1: {"message":"SQLSTATE[HY000]: General error: 1111 Invalid use of group function (SQL: select count(*) as aggregate from (select tele_plan.id as PlanID ,tele_plan.plan_name as PlanName ,tele_plan.plan_cost as PlanCost ,tele_plan.plan_details as PlanDetails ,sum(tele_payment_items.amount) as AmountPaid ,COALESCE(sum(tele_payment_items.discount),0) as折扣,(COALESCE(tele_plan.plan_cost,0) - sum(COALESCE(tele_payment_items.discount,0))) - sum(coalesce(tele_payment_items.amount, 0)) as由于from tele_plan_select {{ 1}} tele_plan inner join tele_plan on ID为. tele_plan_select = teleplan_id . tele_payment_defs left join tele_payment_defs on telereg_id {{1} } tele_plan_select . telereg_id = tele_payment_items . tele_payment_items left join telepaymentdefs_id on tele_payment_defs . ID为= tele_payment_items . teleplan_id and {tele_plan {1}} ID为. {tele_plan_select {1}} {telereg_id {1}} {tele_plan {1}} ID为=

1 个答案:

答案 0 :(得分:0)

您可以使用像sum这样的原始sql函数,但是您必须将它们包装在laravel的\DB::raw()函数中,这样它们就不会被转义。

对于您的Where子句,您应该执行以下操作

->where('tele_plan.plan_cost', '<>', \DB::raw('sum(tele_payment_items.amount)'));

您也可以使用laravel的WhereRaw函数编写自己的条件:

->whereRaw('tele_plan.plan_cost <> sum(tele_payment_items.amount)')

<强>更新 该错误表明GroupBy存在问题。这样做的原因是因为一个总和只能在一个组之后完成,但是一个不可以。因此,这必须添加到HAVING clause

用a替换where,这应该有效:

->havingRaw('tele_plan.plan_cost <> sum(tele_payment_items.amount)');