如何在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 子句获取行值?
MAX日期的Laravel子查询-与父级的子查询链接中的日期时间格式无效