在 laravel 框架中使用 whereraw/where 中的 SUM
using SUM in whereraw/where in laravel framework
我有名为 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)');
我不确定我们是否可以在 where/whereraw
中使用 sum
有人可以帮助我吗?
编辑 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
Discount,(COALESCE(tele_plan.plan_cost,0) - sum(COALESCE(tele_payment_items.discount,0))) - sum(coalesce(tele_payment_items.amount, 0)) as
Duefrom
tele_plan_selectinner join
tele_planon
tele_plan.
id=
tele_plan_select.
teleplan_idleft join
tele_payment_defson
tele_payment_defs.
telereg_id=
tele_plan_select.
telereg_idleft join
tele_payment_itemson
tele_payment_items.
telepaymentdefs_id=
tele_payment_defs.
idand
tele_payment_items.
teleplan_id=
tele_plan.
idwhere
tele_plan_select.
telereg_id = 8 and tele_plan.plan_cost <> sum(tele_payment_items.amount) group by
tele_plan.
id) as a) @ C:\xampp\htdocs\halframework\vendor\laravel\framework\src\Illuminate\Database\Connection.php:625","status":"failed"}
您可以使用像 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 存在问题。之所以这样是因为a sum 只能在group by 之后做,而a where 不行。因此,必须将其添加到 HAVING clause.
中
将 where 替换为 having,这应该有效:
->havingRaw('tele_plan.plan_cost <> sum(tele_payment_items.amount)');
我有名为 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)');
我不确定我们是否可以在 where/whereraw
中使用 sum
有人可以帮助我吗?
编辑 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
Discount,(COALESCE(tele_plan.plan_cost,0) - sum(COALESCE(tele_payment_items.discount,0))) - sum(coalesce(tele_payment_items.amount, 0)) as
Duefrom
tele_plan_selectinner join
tele_planon
tele_plan.
id=
tele_plan_select.
teleplan_idleft join
tele_payment_defson
tele_payment_defs.
telereg_id=
tele_plan_select.
telereg_idleft join
tele_payment_itemson
tele_payment_items.
telepaymentdefs_id=
tele_payment_defs.
idand
tele_payment_items.
teleplan_id=
tele_plan.
idwhere
tele_plan_select.
telereg_id = 8 and tele_plan.plan_cost <> sum(tele_payment_items.amount) group by
tele_plan.
id) as a) @ C:\xampp\htdocs\halframework\vendor\laravel\framework\src\Illuminate\Database\Connection.php:625","status":"failed"}
您可以使用像 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 存在问题。之所以这样是因为a sum 只能在group by 之后做,而a where 不行。因此,必须将其添加到 HAVING clause.
中将 where 替换为 having,这应该有效:
->havingRaw('tele_plan.plan_cost <> sum(tele_payment_items.amount)');