Laravel 雄辩的查询与条件下另一个表中的值的总和
Posted
技术标签:
【中文标题】Laravel 雄辩的查询与条件下另一个表中的值的总和【英文标题】:Laravel eloquent query with sum of values from another table on a condition 【发布时间】:2020-09-12 19:29:55 【问题描述】:我有两张桌子。交易和分配。 一个事务可以有多个分配。 关系定义如下:
内部分配表
class Allocation extends Model
public function transaction_fk()
return $this->belongsTo('App\Models\Transaction','transaction_id');
内部交易表
class Transaction extends Model
public function allocations()
return $this->hasMany('App\Models\Allocation');
我需要查询事务表中具有特定 ID 的所有行以及该事务行的分配总和如果事务总和不等于分配总和,则使用分配总和 >。大致如下:
Transaction::where('id',$id)->where('amount','!==','sum(allocations.amount)')->with('balance' as 'sum(allocations.amount)')->get();
此查询不起作用。我错过了什么?
我能够将它作为一个简单的查询来完成,我循环并进行了第二个查询并添加到列表中。它给了我正确的结果。如您所见,这是冗长而缓慢的。我需要在查询数据库时立即执行此操作。
$transactions2 = Transaction::where('contact_type','supplier')
->where('contact_id',$ehead->supplier_id)
->get();
$transactions = [];
foreach ($transactions2 as $item)
$sum = Allocation::where('transaction_id',$item['id'])->get()->sum('amount');
if($item['amount'] !== $sum)
$item->unallocated_amount = $sum;
array_push($transactions, $item);
【问题讨论】:
首先值得注意的是您的情况是错误的。 !== 需要是 ,但您也可能需要使用 Raw 方法 - laravel.com/docs/7.x/queries#raw-methods 我的回答对您没有帮助吗? 【参考方案1】:如果您想在单个查询中执行此操作,则必须使用 groupBy 和聚合函数。
$items = Transaction::query()
->join('allocations', 'transactions.id', '=', 'allocations.transaction_id')
->groupBy('transactions.id')
->having('transactions.amount', '<>', 'sum(allocations.amount)')
->whereIn('transactions.id', $transactions2)
->select('transactions.*')
->get();
【讨论】:
以上是关于Laravel 雄辩的查询与条件下另一个表中的值的总和的主要内容,如果未能解决你的问题,请参考以下文章
在laravel [实现过滤器]中将多个表与雄辩和急切的加载一起加入