Mysql Laravel雄辩的查询,条件为另一个表的值之和
我有两张桌子。交易和分配。 一个事务可以有多个分配。 关系定义如下: 内部分配表Mysql Laravel雄辩的查询,条件为另一个表的值之和,mysql,laravel,eloquent,laravel-7,Mysql,Laravel,Eloquent,Laravel 7,我有两张桌子。交易和分配。 一个事务可以有多个分配。 关系定义如下: 内部分配表 class Allocation extends Model { public function transaction_fk(){ return $this->belongsTo('App\Models\Transaction','transaction_id'); } } class Transaction extends Model { public funct
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');
}
}
内部交易表
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);
}
}
如果要在单个查询中执行此操作,则必须使用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();
$items=事务::查询()
->join('allocations'、'transactions.id'、'='、'allocations.transaction_id')
->groupBy('transactions.id')
->具有('transactions.amount','','sum(assignments.amount)')
->其中('transactions.id',$transactions2)
->选择('transactions.*')
->get();
第一件值得注意的事情是您的病情有问题。!==需要,但你也可能需要使用原始方法-我的答案对你没有帮助吗?