将groupBy()与orderBy()和limit()结合使用

时间:2018-06-22 02:17:41

标签: php mysql laravel eloquent

我有一个数据库表,其中包含超过1000个资产的记录,每个资产可以有1000个条目。

例如:

ID         ASSET_ID  MANY_COLUMNS_OF_DATA  CREATED_AT
1          345       Stuff                 2018-04-01....
....
200        946       Stuff                 .....
...
3000       345       Stuff                 2018-05-01....
....
1000000    925       Stuff                 2018-05-01....

在一个电话中,我希望能够:

  1. 指定我需要的ASSET_ID。我相信whereIn()。
  2. 按ASSET_ID将结果分组
  3. 仅在特定日期或之前获取这些记录
  4. 以相反的日期顺序获取它们。我相信我可以使用orderBy('id','desc)。
  5. 为每个ASSET_ID记录特定数量的记录

我可能需要退回从1到n的任意数量的资产。

我玩过各种各样的方法,但是出了一些问题,因为我只得到了一条记录。

例如:

        USING THE DB FACADE
        $data = DB::table( 'table' )
            ->whereIn( 'asset_id', $assetIDs )
            ->groupBy( 'asset_id' )
            ->having( 'created_at', '<=', $this->dateINeed )
            ->limit( $numberOfRowsINeed )
            ->get();

        USING ELOQUENT
        $data = $modelToRead->whereIn( 'asset_id', $assetIDs )
            ->groupBy( 'asset_id' )
            ->where( 'created_at', '<=', $this->dateINeed )
            ->orderBy( 'id', 'desc' )
            ->take( $numberOfRowsINeed )
            ->get();

所以我想返回的是一个数据数组,其中每个资产的记录分别列出,例如:

$data = [
   '345' => [
       .....
       .....
    ],
   '234' => [
       .....
       .....
    ],
   '123' => [
       .....
       .....
    ],
   'etc' => [
       .....
       .....
    ],
]

任何帮助将不胜感激。

谢谢。

1 个答案:

答案 0 :(得分:0)

SQL分组用于聚合数据,而不是用于组织输出。

通过方法调用(SQL)删除查询生成器groupB,获取所需的所有行,并返回一个集合。

$collection = $model->...->get();

然后使用收集方法groupBy按资产ID组织所有收集。

$grouped = $collection->groupBy('asset_id');