获取具有相关 table 聚合的对象
Fetch object with aggregations on related table
如何使用 eloquent laravel 4.
在相关 table 上获取具有聚合的对象
sql 结构:
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();
有人知道我可以获取评级夸大的公司吗?
我自己想通了,这里解决:
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 returns 空集评分[]。这是我解决这个问题时最困惑的事情。
在下一个属性中,我们应该使用 DB::raw 查询而不是 Eloquent avg() 方法。
此解决方案中的附加功能是 PostgreSQL 中的 round'ing 数字,应首先从 float 转换为 numeric 和 CASE 语句计数通过 sum() 仅指定了 评论 的评分。
当然查询结果应该使用Cache::remember方法存储在缓存中。
如何使用 eloquent laravel 4.
在相关 table 上获取具有聚合的对象sql 结构:
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();
有人知道我可以获取评级夸大的公司吗?
我自己想通了,这里解决:
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 returns 空集评分[]。这是我解决这个问题时最困惑的事情。
在下一个属性中,我们应该使用 DB::raw 查询而不是 Eloquent avg() 方法。
此解决方案中的附加功能是 PostgreSQL 中的 round'ing 数字,应首先从 float 转换为 numeric 和 CASE 语句计数通过 sum() 仅指定了 评论 的评分。
当然查询结果应该使用Cache::remember方法存储在缓存中。