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
我有两个表 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