如何在 laravel 中的子查询中求和

how to sum in subquery in laravel

我想在 addselect() 函数中求和,但它显示错误。 我有 2 个模型,如下所示:

1.jewelItem 型号:

protected $table = 'jewel_items';

public function buyInvoice(){
    return $this->belongsTo(BuyInvoice::class,'buy_invoice_id');
}

2.buyInvoice 型号:

protected $table = 'buy_invoices';

public function jewelsItems(){
return $this->hasMany(JewelsItems::class);
}

并且每个 jewelItem 都有重量列。 我的查询:

  $buyInvoice=BuyInvoice::addSelect(['allWeight'=>JewelsItem::whereColumn('buy_invoices.id','buy_invoice_id')->sum('weight')
        ])->get();

但它向我显示此错误:

Column not found: 1054 Unknown column 'buy_invoices.id' in 'where clause' (SQL: select sum(`weight`) as aggregate from `jewel_items` where `buy_invoices`.`id` = `buy_invoice_id`)

我如何在不使用 Raw 方法的情况下解决这个问题,因为 here 说“原始语句将作为字符串注入到查询中”并且它很容易受到攻击。

您忘记在此子查询中使用连接

JewelsItem::whereColumn('buy_invoices.id','buy_invoice_id')->sum('weight')

在较新版本的 laravel 中,您可以使用 withSum 获取相关 jewelsItems

的权重总和
$buyInvoice=BuyInvoice::withSum('jewelsItems', 'weight')
                      ->orderBy('jewelsItems_sum_weight')
                      ->get();

或者在旧版本中,您可以使用 withCount 求和为

 $buyInvoice= BuyInvoice::withCount([
                            'jewelsItems as allWeight' => function ($query) {
                                        $query->select(DB::raw("sum(weight)"));
                            }
                    ])->orderBy('allWeight')
                      ->get();

Laravel 没有执行自定义计数子查询,而是使用方法 withSum() 来执行此操作的语法糖。一个例子可能是。

$data = Model::query()->withSum('relation.subRelation','weight')->get();