【问题标题】:Fetch object with aggregations on related table在相关表上获取具有聚合的对象
【发布时间】:2015-04-10 10:46:49
【问题描述】:

如何使用 eloquent laravel 4 在相关表上获取具有聚合的对象。

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();

有人知道我可以获取评级夸大的公司吗?

【问题讨论】:

    标签: postgresql laravel laravel-4 eloquent aggregate


    【解决方案1】:

    我自己想通了,这里解决方案:

    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 中的第一个属性是 necessary - 我不知道为什么,但没有它 laravel 返回空集评级[]。这是解决这个问题时最让我困惑的事情。

    在下一个属性中我们应该使用 DB::raw 查询而不是 Eloquent avg() 方法。

    此解决方案中的附加功能是 PostgreSQL 中的 round 数字,应首先从浮点数转换为 numeric 并且 CASE 语句仅按 sum() 计数评论指定。

    当然查询结果应该使用 Cache::remember 方法存储在缓存中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-13
      • 1970-01-01
      • 2018-12-10
      • 1970-01-01
      • 2020-07-23
      • 1970-01-01
      • 2016-06-27
      • 2011-02-19
      相关资源
      最近更新 更多