【问题标题】:how to sum in subquery in laravel如何在laravel中的子查询中求和
【发布时间】:2021-05-14 12:04:16
【问题描述】:

我想在 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 说“原始语句将作为字符串注入到查询中”并且很容易受到攻击。

【问题讨论】:

    标签: laravel eloquent query-builder


    【解决方案1】:

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

    $buyInvoice=BuyInvoice::withSum('jewelsItems', 'weight')
                          ->orderBy('jewelsItems_sum_weight')
                          ->get();
    

    或者在旧版本中,您可以使用 withCount 作为 sum as

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

    【讨论】:

    • 我收到一个新错误:调用未定义的方法 App\Models\BuyInvoice::withSum()
    • @yassin 所以你使用的是旧版本然后尝试第二种方法 withCount
    • 但是我的伙计。我的 laravel 框架版本是 8.0.0 所以它旧了吗?正如我所说,我不想使用原始方法,因为它很脆弱
    【解决方案2】:

    你忘记在这个子查询中使用 join

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

    【讨论】:

      猜你喜欢
      • 2021-03-27
      • 1970-01-01
      • 2017-09-15
      • 2018-07-07
      • 2017-05-25
      • 2019-05-23
      • 2021-09-16
      • 2013-07-09
      相关资源
      最近更新 更多