【问题标题】:How to get the last one data from each collection in Laravel如何从 Laravel 中的每个集合中获取最后一个数据
【发布时间】:2020-04-27 20:37:57
【问题描述】:

我只想从每个集合中获取一个按created_at 排序的最新数据,

这是我现在的代码:

$getDevice = Devices::where('id_project', $id_project)
                          ->where('id_room', $id_room)
                          ->get()
                          ->groupBy(function($item){
                              return $item->mac_address;
                          });

 dd($getDevice);

输出:

谢谢。

【问题讨论】:

    标签: php laravel collections


    【解决方案1】:

    你不能为mysql分组排序数据,所以你可以这样做:

    对于 MYSQL 方式:


    自动增量 ID:

    每个集合的最新数据表示每个集合中的最大id。

    所以你可以找到每个组中的所有max id,并使用子查询来获取所有这些记录:

    $getDevice = Devices::whereIn('id', function($q) use ($id_project, $id_room) {
                              $q->from('devices')
                                ->where('id_project', $id_project)
                                ->where('id_room', $id_room)
                                ->groupBy('mac_address')
                                ->selectRaw('MAX(id) AS id');
                          })->get();
    
    UUID:

    因为 uuid 是无序字符串,所以可以通过mac_addressmax created_at 加入。并再次按mac_address分组,这样会得到最新的数据

    $deviceQuery = Devices::where('id_project', $id_project)
                          ->where('id_room', $id_room)
                          ->groupBy('mac_address')
                          ->select('mac_address', 'MAX(created_at) AS created_at');
    
    
    $getDevice = Devices::joinSub($deviceQuery, 'dev', function($join) {
                              $join->on('dev.mac_address', '=', 'devices.mac_address')
                                   ->whereColumn('dev.created_at', 'devices.created_at');
                          })->groupBy('mac_address')
                            ->get();
    

    收款方式:


    collection 会更易读,但是需要从 DB 中取出数据,然后过滤得到 group 中的最后一个数据。

    $getDevice = Devices::where('id_project', $id_project)
                              ->where('id_room', $id_room)
                              ->get()
                              ->groupBy('mac_address')
                              ->map(function($items) {
                                  return $items->sortByDesc('mac_address')->first();
                              })->values();
    

    【讨论】:

    • 我可以用 created_at 时间更改->selectRaw('MAX(id) AS id'); 吗?因为我的 id 是 UUID 我尝试更改 ->selectRaw('MAX(created_at) AS created_at'); 显示 null []
    • 谢谢你,它的工作就像魅力,我使用收藏方式,还有一点更正,我把sortByDesc('mac_address')改成sortByDesc('created_at')
    【解决方案2】:

    试试 $model->orderBy('column', 'desc')->first();

    【讨论】:

      【解决方案3】:

      你可以使用 Devices::latest()->first(); 因此,您可以使用此示例构建查询:

      Devices::where('id_project', $id_project)
                ->where('id_room', $id_room)
                ->latest()->first();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-19
        • 2015-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-07
        • 1970-01-01
        相关资源
        最近更新 更多