首页 > 解决方案 > 获取当周用户的最高分 Laravel

问题描述

我有一个具有以下值的表“分数”

id  user_id score   created_at            updated_at
43  33      88      2020-02-23 00:00:00     NULL
44  33      89      2020-02-24 00:00:00     NULL
45  33      42      2020-02-24 00:00:00     NULL
46  33      86      2020-02-25 00:00:00     NULL
47  33      100     2020-02-04 00:00:00     NULL 

我正在尝试在本周打印特定用户的最高分。我正在使用以下代码。

            $week = GameScore::whereDate('created_at', '>=', Carbon::now()->startOfWeek()->format('Y-m-d H:i:s'))
            ->whereDate('created_at', '<=', Carbon::now()->endOfWeek()->format('Y-m-d H:i:s'))
            ->where('user_id', $user->id)
            ->orderBy('score','desc')
            ->limit(1)
            ->first();

当我运行上面的代码时,我得到 86 作为结果。

  "result": {
    "id": 46,
    "user_id": 33,
    "score": 86,
    "created_at": "2020-02-24 18:30:00",    //this date is not correct for score 86 as per the table
    "updated_at": null
   }

但是如果我在 mysql 中运行相同的查询,我会得到 89,根据我的要求,89 应该是答案,因为 89 是本周迄今为止用户的最高分。

我为上述代码运行的 mySql 查询

   select * from `scores` where date(`created_at`) >= '2020-02-24 00:00:00' and date(`created_at`) <= '2020-03-01 23:59:59' and `user_id` = 33 order by `score` desc limit 1

标签: mysqllaravelphp-carbon

解决方案


Laravel您可以使用eloquent 的->max('')功能链接您的查询。它以列名作为参数。

您的查询应如下所示:

$week = GameScore::whereDate('created_at', '>=', Carbon::now()->startOfWeek()->format('Y-m-d H:i:s'))
        ->whereDate('created_at', '<=', Carbon::now()->endOfWeek()->format('Y-m-d H:i:s'))
        ->where('user_id', $user->id)
        ->max('score');

推荐阅读