Получить наивысший балл пользователя за текущую неделю Laravel - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть таблица «Score» со следующими значениями

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

Ответы [ 3 ]

0 голосов
/ 26 февраля 2020

Вы можете использовать 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');

Для более подробной информации проверьте https://laravel.com/docs/5.5/queries#aggregates

0 голосов
/ 26 февраля 2020

Я думаю, что проблема в часовом поясе. Вы можете попробовать использовать часовой пояс mysql для углерода:

->where('created_at', '>=', Carbon::now()->startOfWeek()->tz('xxx')->format('Y-m-d H:i:s'))

или изменить конфигурацию / приложение. php

'timezone' => 'xxx'; // change to the same as mysql
0 голосов
/ 26 февраля 2020

Вы можете связать свой запрос с помощью функции 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');
...