Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql Laravel雄辩的查询,条件为另一个表的值之和_Mysql_Laravel_Eloquent_Laravel 7 - Fatal编程技术网

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();

第一件值得注意的事情是您的病情有问题。!==需要,但你也可能需要使用原始方法-我的答案对你没有帮助吗?