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

Posted

技术标签:

【中文标题】如何在laravel中的子查询中求和【英文标题】:how to sum in subquery in 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 说“原始语句将作为字符串注入到查询中”并且很容易受到攻击。

【问题讨论】:

【参考方案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')

【讨论】:

以上是关于如何在laravel中的子查询中求和的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel 8 中使用 PostgreSQL 中的子查询通过 group by 子句获取行值?

ON 子句 Laravel ORM 中的子查询

MAX日期的Laravel子查询-与父级的子查询链接中的日期时间格式无效

Laravel Query Builder 在“whereIn”语句的子查询中使用父查询?

选择语句中的子查询如何在 oracle 中工作

如何在 SQL Server 中的 UPDATE 查询的子查询中引用表变量