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 雄辩的条件来创建以下查询

在laravel [实现过滤器]中将多个表与雄辩和急切的加载一起加入

Laravel 雄辩的 SQL 查询与 OR 和 AND 与 where 子句

Laravel 通过属性获得雄辩的查询构建器关系

Laravel:自我 JOIN 的雄辩查询