这应该很简单,但我无法理解。我有一个发票表和一个付款表。发票有许多付款,总付款金额是使用original_amount*exchange_rate计算的。我所需要做的就是查看已付款的发票。这是代码:
在Invoice.php 中
public function payments() {
return $this->hasMany(Payment::class);
}
public function scopePaid($query) {
return $query->whereHas('payments', function (Builder $query)) {
// This is the pseudo code part....
$query->where('original_amount' * 'exchange_rate', '>=', $invoice->amount_due);
}
我只是希望它是那么简单,但这当然行不通。我总是可以创建一个静态函数,在发票中循环检查其付款状态,并返回一组已付款发票,但这不是范围,我希望能找到比这更优雅的东西。有什么想法吗?
谢谢!
使用groupBy
和havingRaw
:
$query->groupBy('invoice_id')
->havingRaw('SUM(original_amount * exchange_rate) >= invoices.amount_due');
谢谢@TsaiKoga。你真是个大师!
只是澄清一下,最终版本是:
public function scopePaid1($query) {
return $query->whereHas('payments', function (Builder $query){
return $query->groupBy('invoice_id')
->havingRaw('SUM(original_amount * exchange_rate) >= invoices.amount_due');
});
}
按照这个建议配置数据库是很重要的。