获取具有相关 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方法存储在缓存中。