laravel group从表中获取最新记录

时间:2019-11-06 11:54:40

标签: laravel laravel-5 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

3 个答案:

答案 0 :(得分:2)

Product::whereRaw('id IN (select MAX(id) FROM products GROUP BY user_id)')
         ->whereNotNull('user_id')
         ->orderBy('id','desc')
         ->get();

您将需要一个嵌套查询,我认为您不能避免它,但是此解决方案应该有效。

GroupBy发生在OrderBy之前,因此您必须先获取最近的记录

答案 1 :(得分:1)

尝试一下:

$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');

答案 2 :(得分:0)

签出Laravel Docs

最新/最旧
latestoldest方法可让您轻松按日期对结果进行排序。默认情况下,结果将按created_at列排序。或者,您可以传递希望排序的列名:

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