Laravel Query Builder - Как я могу подвести итог? - PullRequest
0 голосов
/ 17 октября 2019

Я записываю записи времени для пользователей для каждого месяца года. Время указано в следующем формате: чч: мм: сс

пример: 08: 32: 00

Вот как я группирую свои месяцы:

  $data = $user->times()->whereYear('start_day', 2019)->get();
        $group_months = $data->groupBy(function($entry) {
             return Carbon::parse($entry->start_day)->format('m');
      });

Как я могу сложить $ group_months, чтобы я мог узнать общее время за каждый месяц?

Вот моя миграция для времен

Schema::create('times', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->unsignedBigInteger('user_id');
            $table->date('start_day');
            $table->text('category');
            $table->time('start_time');
            $table->time('finish_time');
            $table->time('duration');
            $table->text('notes');
            $table->timestamps();

            $table->foreign('user_id')->references('id')->on('users');

Ответы [ 2 ]

0 голосов
/ 17 октября 2019
$monthDurations = $user->times()
    ->whereYear('start_day', 2019)
    ->select(
        \DB::raw('SUM(TIME_TO_SEC(duration)) as `month_duration_in_seconds`'),
        \DB::raw('DATE_FORMAT(start_day, "%Y-%m") as `year_month`'),
        'category',
        'user_id'
    )
    ->groupBy(\DB::raw('DATE_FORMAT(start_day, "%Y-%m")'), 'category', 'user_id')
    ->get();
0 голосов
/ 17 октября 2019

Это не было проверено. Однако вы должны быть в состоянии достичь этого с помощью следующего:

$data = $user->times()
    ->whereYear('start_day', 2019)
    ->get()
    ->groupBy(function($entry) {
        return Carbon::parse($entry->start_day)->format('m');
    })->map(function ($times, $month) {
        $seconds = $times->map(function ($time, $key) {
            return \Carbon::parse($time->start_time)->diffInSeconds(\Carbon::parse($time->finish_time));
        })->sum();

        return gmdate('H:i:s', $seconds);

    })->all();

После группировки месяца вы можете использовать метод сбора ->map(), чтобы получить разницу в секундах для достижения времени в месяце.

Затем вы можете сложить все, используя ->sum().

Наконец, вы можете использовать gmdate() для преобразования $seconds в требуемый формат.

Я надеюсь, что этопомогает.

Примечание: Предполагается, что finish_time не идет дальше start_day, указанного в записи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...