在相关表上获取具有聚合的对象

时间:2015-02-10 11:57:01

标签: postgresql laravel laravel-4 eloquent aggregate

如何使用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();

任何人都知道我可以通过评级来获取公司吗?

1 个答案:

答案 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 :: 记住方法存储在缓存中。