Php 如何在fluent查询中使用聚合进行连接和过滤,并保留json结构?

Php 如何在fluent查询中使用聚合进行连接和过滤,并保留json结构?,php,json,laravel,aggregate,fluent,Php,Json,Laravel,Aggregate,Fluent,我一直试图让我的模型在Laravel4.2中使用聚合语句,但没有效果。当我使用“join”时,嵌套的json结构会清空它的记录。它以贷款和付款为基础。 下面是一个简化的模式: 付款:id |贷款| id |已支付|预计 贷款:id |收款类型| id |本金|金额 我需要找出一个帐户是否欠款,欠款多少,以及显示过去的付款 以下是模型: Loan.php Payment.php 执行以下操作将为我提供支付所需的所有数据: Loan::with('collectiontype','payment')

我一直试图让我的模型在Laravel4.2中使用聚合语句,但没有效果。当我使用“join”时,嵌套的json结构会清空它的记录。它以贷款和付款为基础。 下面是一个简化的模式:

付款:id |贷款| id |已支付|预计 贷款:id |收款类型| id |本金|金额

我需要找出一个帐户是否欠款,欠款多少,以及显示过去的付款

以下是模型:

Loan.php

Payment.php

执行以下操作将为我提供支付所需的所有数据:

Loan::with('collectiontype','payment')->get(); 
在贷款模型中,我曾有过以下几点:

public function payAggregate()
{

    return $this->hasOne('Payaggregate','loan_id','id')
                ->select(DB::raw("loan_id, count(*) as count, sum(expected) as sumexpected, sum(paid) as sumpaid, (sum(expected) - sum(paid)) as arrears"))
                ->groupBy('loan_id')
                ->having('arrears','>',10); 
}
这在隔离状态下运行良好。然而,当我试着做一个“用”的时候:

Loan::with('collectiontype','payment','payaggregate')->get(); 
它在没有having子句的情况下起作用,但在没有having子句的情况下起作用。我试过“has”、“whereHas”和许多奇怪而奇妙的东西,但它们似乎都不适合我

然后,我考虑使用连接手动创建:

$v= DB::table('loans AS l')
    ->select(array('l.*', 'p.arrears','ct.shortlabel','pay.paid', 'pay.expected'))
    ->join(DB::raw('(SELECT loan_id, count(*) as count, sum(expected) as sumexpected, sum(paid) as sumpaid, (sum(expected) - sum(paid)) as arrears FROM payments GROUP BY loan_id) AS p'), function( $query ){
        $query->on( 'l.id', '=', 'p.loan_id' );
                    })
    ->join(DB::raw('(SELECT * FROM collectiontypes) AS ct'), function( $query ){
        $query->on( 'l.actualcollection', '=', 'ct.id' );
    })
    ->join(DB::raw('(SELECT * FROM payments) AS pay'), function( $query ){
        $query->on( 'l.id', '=', 'pay.loan_id' );
    })  
    ->where('p.arrears', '>', 10)->paginate(30);

$v->getCollection()->toJson();
然而,这只是给出了一个没有嵌套payments对象的平面输出。我希望我已经清楚地阐述了这个问题

Loan::with('collectiontype','payment','payaggregate')->get(); 
$v= DB::table('loans AS l')
    ->select(array('l.*', 'p.arrears','ct.shortlabel','pay.paid', 'pay.expected'))
    ->join(DB::raw('(SELECT loan_id, count(*) as count, sum(expected) as sumexpected, sum(paid) as sumpaid, (sum(expected) - sum(paid)) as arrears FROM payments GROUP BY loan_id) AS p'), function( $query ){
        $query->on( 'l.id', '=', 'p.loan_id' );
                    })
    ->join(DB::raw('(SELECT * FROM collectiontypes) AS ct'), function( $query ){
        $query->on( 'l.actualcollection', '=', 'ct.id' );
    })
    ->join(DB::raw('(SELECT * FROM payments) AS pay'), function( $query ){
        $query->on( 'l.id', '=', 'pay.loan_id' );
    })  
    ->where('p.arrears', '>', 10)->paginate(30);

$v->getCollection()->toJson();