Laravel - 获取每一行创建的第一个条目

时间:2017-01-04 21:10:41

标签: php laravel eloquent

我正在使用laravel制作应用程序以跟踪我的训练。数据库中的字段是:id,created_at,updated_at,exercise,repetitions和weight。

我想制定所有训练的时间表。时间轴应该是我锻炼的所有日期的列表。

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

2 个答案:

答案 0 :(得分:2)

假设你正在使用像mysql这样的东西,并且有一个像'workouts'这样的表,你提供的列,这应该可以解决问题。

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

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

答案 1 :(得分:0)

你应该对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();

将按照完成的日期对您的所有锻炼进行分组。