
Bug编译狮
Eloquent 是 Laravel 框架中的一个 ORM(对象关系映射),它使得数据库操作更加简单和直观。要在 Eloquent 中查找过去日、周、月或年的记录,可以使用日期时间字段的查询方法。以下是一些示例代码,展示了如何实现这一点:
查找过去一天的记录
use AppModelsYourModel; // 替换为你的模型名称
$today = Carbon::now()->startOfDay();
$previousDay = $today->subDays(1);
$records = YourModel::where('created_at', '>=', $previousDay)->get();
foreach ($records as $record) {
echo $record->id . ' - ' . $record->name . '<br>';
}
在这个示例中,我们首先获取当前日期的开始时间,然后计算出前一天的时间。接着,我们使用 where 方法过滤 created_at 字段大于等于前一天的记录,并使用 get 方法获取所有符合条件的记录。
查找过去一周的记录
use AppModelsYourModel;
$weekAgo = Carbon::now()->subWeek();
$records = YourModel::where('created_at', '>=', $weekAgo)->get();
foreach ($records as $record) {
echo $record->id . ' - ' . $record->name . '<br>';
}
这个示例与上一个示例类似,但我们将 subWeek 方法替换为 subDays(7) 来获取过去的七天。
查找过去一个月的记录
use AppModelsYourModel;
$monthAgo = Carbon::now()->subMonth();
$records = YourModel::where('created_at', '>=', $monthAgo)->get();
foreach ($records as $record) {
echo $record->id . ' - ' . $record->name . '<br>';
}
这个示例与前两个示例类似,但我们将 subMonth 方法替换为 subDays(30) 来获取过去的三十天。
查找过去一年的记录
use AppModelsYourModel;
$yearAgo = Carbon::now()->subYear();
$records = YourModel::where('created_at', '>=', $yearAgo)->get();
foreach ($records as $record) {
echo $record->id . ' - ' . $record->name . '<br>';
}
这个示例与前三个示例类似,但我们将 subYear 方法替换为 subMonths(12) 来获取过去的十二个月。
通过这些示例,你可以看到如何在 Eloquent 中根据不同的日期范围查找过去的日、周、月或年的记录。

黑板Bug讲师
介绍
在Web开发的世界里,处理日期和时间是一项日常必需的任务。如果你使用的是Laravel框架并且使用了Eloquent ORM,那么这项任务会变得更加便捷。在这篇教程中,我们将探讨如何通过时间条件(如最近一天、一周、一个月或一年)来查找记录的Eloquent ORM方法。
在Eloquent中理解日期和时间的处理。
在我们开始编写实际的查询之前,让我们先回顾一下Eloquent如何处理日期和时间。默认情况下,Eloquent会进行转换。created_atandupdated_at从列到实例的转换Carbon这是一个扩展了内置DateTime类的PHP库。这种转换使我们在处理这些字段时能够使用各种有用的方法。
让我们先设定场景,假设有一个名为Eloquent的模型。Post请确保您的模型已启用时间戳字段:
class Post extends Model
{
protected $dates = ['created_at', 'updated_at'];
}
查找最后一天的记录
为了选择记录,你可以使用以下SQL语句:created_at在过去24小时内,你可以使用它。whereDate辅助方法与Carbon库结合使用now方法:
$posts = Post::where('created_at', '>=', \Carbon::now()->subDay())->get();
该查询检索过去一天内创建的帖子。如果你还想排除当前日期的数据,以获得从前天开始的完整24小时范围,则可以调整查询:
$posts = Post::whereDate('created_at', '=', \Carbon::yesterday())->get();
查找过去一周的记录。
向后移动到更早的时间点,如果你需要从过去七天内检索记录,Laravel 提供了一种简单的方法来实现这一点:
$posts = Post::where('created_at', '>=', \Carbon::now()->subWeek())->get();
如果要求获取上个星期的记录,你需要对查询进行一些调整:
$startOfWeek = \Carbon::now()->startOfWeek()->subWeek();
$endOfWeek = \Carbon::now()->startOfWeek()->subDay();
$posts = Post::whereBetween('created_at', [$startOfWeek, $endOfWeek])->get();
查找上个月的记录
为了获取一个月前的记录,Eloquent 允许我们从当前日期减去一个月:
$posts = Post::where('created_at', '>=', \Carbon::now()->subMonth())->get();
为了检索特定于上月的记录:
$startOfMonth = \Carbon::now()->startOfMonth()->subMonth();
$endOfMonth = \Carbon::now()->startOfMonth()->subDay();
$posts = Post::whereBetween('created_at', [$startOfMonth, $endOfMonth])->get();
寻找去年的记录。
为了从过去一年中选择记录,我们需要调整我们的查询,将当前时间减去一整年。以下的查询可以获取过去一年的所有帖子:
$posts = Post::where('created_at', '>=', \Carbon::now()->subYear())->get();
对于上一年度的记录查询,语句为:
$startOfYear = \Carbon::now()->startOfYear()->subYear();
$endOfYear = \Carbon::now()->startOfYear()->subDay();
$posts = Post::whereBetween('created_at', [$startOfYear, $endOfYear])->get();
高级基于时间的 eloquent 查询
现在,我们将我们的查询提升到一个新的水平,通过添加额外的约束条件并利用范围来实现这一点。
使用范围(scopes)来重用查询。
为了避免在应用程序的多个查询中重复使用相同的逻辑,可以在Eloquent模型中定义一个查询范围:
class Post extends Model
{
// Previous definition of the Post model
public function scopePastMonth($query)
{
return $query->where('created_at', '>=', \Carbon::now()->subMonth());
}
}
使用光圈非常简单:
$posts = Post::pastMonth()->get();
结合时间基查询与其他条件
你可以结合时间相关的查询与其他Eloquent条款以获得更精确的结果:
$posts = Post::pastMonth()
->where('status', 'published')
->orderBy('views', 'DESC')
->limit(10)
->get();
结论。
通过利用Eloquent和Carbon的强大组合,基于时间范围(如最近一天、一周、一个月或一年)查找记录变得轻而易举在Laravel中。无论是构建复杂的还是简单的数据检索请求,Eloquent的表达式语法与Carbon的日期操作方法提供了创建动态且敏感于日期的应用程序的有效且开发者友好的方式。

长工码奴1523
要在Eloquent ORM(Eloquent Model)中查询过去一段时间的记录,我们可以使用where()方法结合日期函数来实现。假设我们有一个模型类User,其中有一个字段叫做created_at,表示用户创建的时间戳。
以下是如何根据当前日期返回过去一周、一个月和一年的记录:
use IlluminateSupportFacadesDB;
use AppModelsUser;
// 假设 $today 是当前日期
$weeksAgo = DB::table('users')
->select(DB::raw("DATE_FORMAT(created_at, '%Y-%m') as date"))
->whereDate('date', '>', $today->subWeeks(1))
->get();
$monthsAgo = DB::table('users')
->select(DB::raw("DATE_FORMAT(created_at, '%Y-%m') as date"))
->whereDate('date', '>', $today->subMonths(1))
->get();
$yearsAgo = DB::table('users')
->select(DB::raw("DATE_FORMAT(created_at, '%Y-%m') as date"))
->whereDate('date', '>', $today->subYears(1))
->get();
在这个例子中,我们首先从users表中选择在过去一周、一个月和一年前的所有记录。然后,我们将这些日期转换为字符串并使用WHERE DATE_FORMAT子句进行比较。
注意:这个示例假定 $today 是一个已知的日期对象,例如new DateTime("2023-04-01")。你需要根据实际情况替换这个值。此外,如果你的数据库支持日期时间类型,你可以直接使用WHERE DATE(created_at) > :start_date这样的SQL查询代替上述代码中的WHERE DATE_FORMAT(created_at, '%Y-%m')。
另外,确保你在应用了DB::table('users')后添加了相应的表名,因为不同的数据库可能有不同的命名约定。例如,在MySQL中,用户表通常被称为users。

