Laravel 列值大于相关模型列值总和的查询

Laravel query where column value is greater than sum of related model column values

我有两个表 transactions 和 transaction_allocations。一笔交易可以有很多分配。

交易模式

Schema::create('transactions', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->timestamps();
            $table->foreignId('contact_id')->constrained();
            $table->decimal('amount',19,4)->nullable();
        });

分配模型

Schema::create('transaction_allocations', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->timestamp('created_at');
            $table->foreignId('transaction_id')->nullable()->constrained();
            $table->foreignId('bill_id')->nullable()->references('id')->on('bills');
            $table->decimal('amount',19,4)->nullable();
        });

事务模型中的关系

public function allocations(){
        return $this->hasMany(TransactionAllocation::class);
    }

我需要查询所有交易金额大于该笔交易所有分配金额之和的交易。 (基本上找到有未分配余额的交易)。

Transaction::where('contact_id',$id)->where('amount','>',sum of allocations)->get();

如何实现?

我能够创建一个访问器来执行此计算并找到未分配的数量。但似乎无法在何处使用访问器。我不想加载所有交易然后过滤它,因为它太多了。

我想直接查询并获取过滤后的行。我该怎么做?

我认为使用 Raw 比较两列更好。

  Transaction::where('contact_id',$id)
              ->with('allocations')
              ->whereHas("allocations",function ($query){
                  $query->havingRaw('transactions.credit>sum(amount)');
                  $query->groupBy('transaction_id');
              })->orDoesntHave("allocations")
              ->get();

如果查询失败,则尝试 'strict' => false in database.php for mysql connection