【问题标题】:Laravel Eloquent - take most recent n entriesLaravel Eloquent - 获取最近的 n 个条目
【发布时间】:2014-07-23 03:27:47
【问题描述】:

我有一个模型Login,其中包含userNametime 字段。我正在尝试在 Eloquent 中编写代码,让最后 n 人登录。

我尝试了许多看起来最直接的变体:

$logins = Login::groupBy('userName') ->orderBy('time', 'desc') ->take($num)->get() ;

很遗憾,日期不是用户最近的登录信息。如果我删除orderBy,数据是有意义的,但此时它仅按用户名排序。需要按时间排序才能成为最后n次登录。

谢谢!

编辑:

看起来就像上面写的那样,结果是用户第一次登录的日期,然后给出了最近的 10 次“首次登录”。
这意味着 groupBy 保留最旧的日期。我不知道如何解决它,但也许这可以帮助某人。

编辑 2:

现在使用 ceejayoz 的建议,我有:

$logins = Login::orderBy(DB::raw('MAX(time)'), 'desc')->groupBy('userName') ->orderBy('time', 'desc') ->take($num)->get() ;//->sortByDesc('time')

现在它提供最近登录的用户,但time 仍然提供他们的第一次登录。我可以将我的视图从使用 time 更改为 ... 代表 MAX('time') 的东西(不确定它的标题),或者使用 AS 来获得不同的名称(尝试过但我没有让它工作)。

快到了! :)

【问题讨论】:

  • 只是出于好奇,如果不是按时间降序排列,它们返回的顺序是什么?
  • 当我删除orderBy 时,它会在userName 上按字母顺序返回。
  • 好的,我觉得你的原始问题很清楚。 orderBy 会发生什么?
  • 对不起,你是对的。实际上它看起来很奇怪而且几乎是随机的,但它不是——它很有趣。以上更新。
  • 等等,关于什么?

标签: laravel


【解决方案1】:

您需要按用户记录的time 列中的最大值排序。

->orderBy(DB::raw('MAX(`time`)'), 'desc')

【讨论】:

  • 啊,这么近了!更新以上格式以获得更清晰的格式。
  • 您需要对SELECT 子句执行相同的操作。像->addSelect(DB::raw('MAX(time) AS maxTime')) 这样的东西。或者,向 User 模型添加一个属性来存储它以供直接访问。
  • 最终答案:$logins = Login::addSelect(DB::raw('*, MAX(time) AS maxTime'))->orderBy(DB::raw('maxtime'), 'desc')->groupBy('userName') ->orderBy('time', 'desc') ->take($num)->get() ; 这是我使用 Laravel 的第一天,我敢打赌有一种更雄辩(请原谅双关语)的方式来做到这一点。又是一天!
  • 好的,对于需要它的人,看来您可以删除第二个orderBy
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-06
  • 2014-03-14
  • 2016-08-05
  • 2014-09-11
  • 2014-10-08
相关资源
最近更新 更多