【问题标题】:Laravel - Get the first entry of every day a row was createdLaravel - 获取创建行的每一天的第一个条目
【发布时间】:2017-05-19 07:17:28
【问题描述】:

我正在使用 laravel 制作一个应用程序来跟踪我的锻炼情况。数据库中的字段有:id、created_at、updated_at、exercise、repetitions和weight。

我想为所有锻炼制定一个时间表。时间表应该是我进行锻炼的所有日期的列表。

我的问题是:我如何获得每次锻炼日期的第一个条目?

【问题讨论】:

  • 您可以有一个日期格式为“Y-m-d”的 date 字段,然后按该字段分组。

标签: php laravel eloquent


【解决方案1】:

你真的应该对 Laravel 采取不同的方法。如果您有一个 Workout 对象,并且每个对象都有 Exercises 与之关联,那么您想要做的事情就变得非常简单:

型号:

  • 锻炼
  • 锻炼

表格:

workout
id | created_at | updated_at

exercises
id | workout_id | exercise | repetitions | weight | created_at | updated_at

在您的锻炼模型中:

public function exercises() {
    return $this->hasMany(App\Excercise::class);
}

然后在你的控制器中你可以这样做:

<?php

$workouts = App\Workout::all();

foreach ($workouts as $key => $workout) {
    $exercises = $workout->exercises;
    // do stuff
}

要获得您的时间线,您可以执行以下操作:

$workouts = App\Workout::groupBy(DB::raw('Date(created_at)'))->get();

这会将您的所有锻炼按完成的日期分组。

【讨论】:

    【解决方案2】:

    假设您使用的是 mysql 之类的东西,并且有一个表(例如“锻炼”),以及您提供的列,这应该可以解决问题。

    DB::table('workouts')
        ->orderBy('created_at', 'asc')
        ->groupBy(DB::raw('DATE(created_at)'))
        ->get();
    

    这实质上是从锻炼表中选择 *,然后按 created_at 列以升序对其进行排序,然后对 created_at 列进行分组,因此每个日期仅检索 1 个条目。需要 'DB::raw('DATE('created_at'))' 将 created_at 字段创建为 mysql 日期对象(默认情况下,laravel 使用日期时间作为其时间戳)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-04
      • 1970-01-01
      • 2016-07-14
      • 1970-01-01
      • 2023-04-01
      • 2011-07-22
      • 1970-01-01
      • 2015-09-29
      相关资源
      最近更新 更多