【问题标题】:laravel group by fetch latest record from tablelaravel group by 从表中获取最新记录
【发布时间】:2019-11-06 20:34:55
【问题描述】:

我有一张表,我想按用户检索数据组,但我想要结果中的最新条目,如何使用 eloquent 来做到这一点。

这是我正在使用的一个雄辩的查询。

Product::whereNotNull('user_id')
         ->orderBy('id','desc')
         ->groupBy('user_id')
         ->get();

这是我的桌子

Id   Name   user_id
-------------------------
1    A       1
2    b       1
3    c       2
4    d       2
5    e       3
6    f       3

结果我的查询给了我

Id   Name   user_id
-------------------------
1    A       1
3    c       2
5    e       3

我想要的结果

Id   Name   user_id
-------------------------
2    b       1
4    d       2
6    f       3

【问题讨论】:

标签: laravel laravel-5 eloquent


【解决方案1】:
Product::whereRaw('id IN (select MAX(id) FROM products GROUP BY user_id)')
         ->whereNotNull('user_id')
         ->orderBy('id','desc')
         ->get();

你需要一个嵌套查询,我认为你不能避免它,但这个解决方案应该可以工作。

GroupBy 发生在OrderBy 之前,因此您必须在下单前获得最后一条记录

【讨论】:

    【解决方案2】:

    试试这个:

    $subquery = Product::orderBy('id','DESC');
    
    $products = DB::table(DB::raw("({$subquery->toSql()}) as subquery"))
       ->whereNotNull('user_id')
       ->groupBy('user_id')
       ->get();
    

    第二种方式:在集合中使用unique() 方法(unique 方法返回集合中的所有唯一模型):

    $products = Product::whereNotNull('user_id')
                 ->orderBy('id','desc')
                 ->get()
                 ->unique('user_id');
    

    【讨论】:

    • 嘿,Yasin,您的第一个解决方案有效但没有返回 eloquent 对象,第二个解决方案无效......
    【解决方案3】:

    查看Laravel Docs

    最新/最旧
    latest 和 oldest 方法允许您轻松地按日期排序结果。默认情况下,结果将按created_at 列排序。或者,您可以传递您希望排序的列名:

    $product = Product::latest()->first();
    

    【讨论】:

      猜你喜欢
      • 2013-06-27
      • 2016-05-15
      • 2021-01-20
      • 2020-12-19
      • 2020-08-11
      • 2017-09-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多