首页 > 解决方案 > Laravel queryBuilder,一种通过 group by 保持最新日期值的好方法

问题描述

我有一个像这样构建的 mysql 数据透视表。

id, person_id, objective_id, achieved_at(date)

每条记录都显示了一个人的目标,这意味着一个人可以在不同的日子里有相同的目标。我的目标是建立一个按人和目标分组的查询,但保留最近的成就记录。

当然,使用 GROUP BY person_id、objective_id 和 ORDER BY allowed_at 的简单查询是行不通的,所以我尝试了 Collection 的过滤方法。

变量 $results 包含 queryBuilder,现在我使用此代码,但我认为非常慢且效率低下。

$filtered = $results->filter(function ($row, $key)use($results) {
            $latest = $results->where("person_id",$row->person_id)->where("objective_id",$row->objective_id)
                ->orderBy("achieved_at","DESC")
                ->first();
            if( $row->id == $latest->id){
                return $latest;
            }
        });

如何优化此方法?

标签: phplaravel-7laravel-query-builderlaravel-collection

解决方案


推荐阅读