如何使用eloquent laravel 4在相关表上获取具有聚合的对象。
sql structre:
TABLE companies
id PRIMARY KEY
title TEXT
...
TABLE ratings
id PRIMATRY KEY
company_id FK KEY
some_rating_1 INTEGER -- for example rating for delivery
some_rating_2 INTEGER -- for example rating for customer service
some_rating_2 INTEGER -- for example rating for price
...
我希望收集具有综合评分的公司。
我尝试了类似下面的内容,但我无法将AVG附加到GET中。
Company::with(['ratings' => function($query) {
$query->avg('some_rating_1');
$query->avg('some_rating_2');
$query->avg('some_rating_3');
$query->get(['company_id', 'some_rating_1']);
}])->get();
任何人都知道我可以通过评级来获取公司吗?
答案 0 :(得分:0)
我想出了自己,这里是解决方案:
Company::with(['ratings' => function($query) {
$query->select(
'company_id',
DB::raw('round(avg(rating_overall)::numeric, 2) as rating_overall'),
DB::raw('round(avg(some_rating_1)::numeric, 2) as rating_fast'),
DB::raw('round(avg(some_rating_2)::numeric, 2) as rating_quality'),
DB::raw('round(avg(some_rating_3)::numeric, 2) as rating_service'),
DB::raw('count(company_id) as rating_amount'),
DB::raw('sum(CASE WHEN review IS NOT NULL THEN 1 else 0 END) as review_amount')
)->groupBy('detective_id');
子查询中的第一个属性' company_id ' FK 必要 - 我不知道为什么但没有它laravel返回空集等级[]。解决这个问题是我最困惑的事情。
在next属性中,我们应该使用 DB :: raw 查询而不是Eloquent avg()方法。
此解决方案中的其他功能是PostgreSQL中的 round 数字,应该首先从float转到数字,CASE语句只用sum()计数已指定审核的评分。
当然,查询结果应使用Cache :: 记住方法存储在缓存中。