LARAVEL ORM:为每个用户选择DATE以区别

时间:2017-09-08 18:35:50

标签: php mysql laravel laravel-5.4

我有一个名为visitor的表:

visitors : (id , user_id , ip  , created_at , route , refer )

我在包含链接的中间件中为每次页面访问存储一行

我想在我的管理面板中显示这些内容,但是你想象它们中有很多,所以我想显示每个用户每天的第一次访问,比如我在db中有这个

1 , 356 , 127.0.0.1 , 2017-08-30 22:41:49
1 , 356 , 127.0.0.1 , 2017-08-30 22:50:49
1 , 356 , 127.0.0.1 , 2017-08-30 22:53:49
1 , 356 , 127.0.0.1 , 2017-08-30 23:11:49
1 , 400 , 127.0.0.1 , 2017-08-30 23:50:49

查询结果应为

1 , 356 , 127.0.0.1 , 2017-08-30 22:41:49
1 , 356 , 127.0.0.1 , 2017-08-30 23:11:49
1 , 400 , 127.0.0.1 , 2017-08-30 23:50:49

所以我想要的是像

DISTINCT(DATE(created_at))

但这会影响所有用户..我希望它能影响每个用户

它非常复杂我不知道该怎么办呢

3 个答案:

答案 0 :(得分:1)

试试这个

 DB::table('visitors')->select('id','user_id','ip','created_at')->groupBy(DB::raw('DATE(created_at)'))->groupBy('user_id')->get();

这将在一天内为独特用户提供。

答案 1 :(得分:0)

我想你可以这样试试:

DB::table('visitors')
   ->distinct('created_at')
   ->orderBy('created_at', 'asc')
   ->get();

另一种方法是为User实体添加额外字段,如fisrt_visit,如果它很重要

答案 2 :(得分:0)

如上所述,您希望使用MIN函数在首次登录时使用GROUP BY按用户ID对其进行分组:

DB::table('visitors')
    ->select(['user_id', DB::raw('MIN(created_at)')])
    ->groupBy('user_id')
    ->get();

如果需要,您可以添加其他列,但密钥为DB::raw('MIN(created_at)'),它将为每个用户获取最早的created_at时间戳。 DB::raw将完全按照您指定的方式传入该字符串。