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