【问题标题】:Laravel eloquent query with sum of values from another table on a conditionLaravel 雄辩的查询与条件下另一个表中的值的总和
【发布时间】: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);
       }

    }

【问题讨论】:

标签: mysql laravel eloquent laravel-7


【解决方案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();

【讨论】:

    猜你喜欢
    • 2019-02-13
    • 2020-10-26
    • 2015-09-28
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-26
    相关资源
    最近更新 更多