Laravel 5.4:如何获取仅本周的记录?

10
为了获取当天的所有记录,我执行了以下操作:
$dt = Carbon::now();
$dataToday = Data::whereDay('created_at', $dt->day)->get();

要获取本周的记录,我尝试了以下方法但没有成功。

$dataThisWeek = Data::where('created_at', $dt->weekOfYear);
$dataThisWeek = Data::where('created_at', $dt->weekOfMonth);
$dataThisWeek = Data::whereWeek('created_at', $dt->week);

我们应该如何使用 Eloquent 和 Carbon(最好)或本地 MYSQL 函数来解决这个问题?
4个回答

30

试试这个:

Data::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->get();

设置一周的开始/结束:

Carbon::setWeekStartsAt(Carbon::SUNDAY);
Carbon::setWeekEndsAt(Carbon::SATURDAY);

6
您也可以尝试:
$dataThisWeek = Data::where(\DB::raw("WEEKOFYEAR(created_at)"), $dt->weekOfYear)->get();

1
为了补充@user320487的回答:
为避免不同第三方库之间的冲突,不应使用静态设置器。在使用endOfWeek方法时,请改用$weekEndsAt可选参数。
Data::whereBetween('created_at', [Carbon::now()->startOfWeek(Carbon::SUNDAY), Carbon::now()->endOfWeek(Carbon::SATURDAY)])->get();

您可以使用“first_day_of_week”本地设置来根据当前选择的语言环境更改一周的开始,并隐含地更改一周的结束。

1

由于某些原因,在使用 Laravel 7.4^ 版本时,上面的解决方案在我的环境中无法正常工作。没有显示任何数据,为了修复它,我添加了以下格式:


$now = Carbon::now();

Data::whereBetween("created_at", [
   $now->startOfWeek()->format('Y-m-d'), //This will return date in format like this: 2022-01-10
   $now->endOfWeek()->format('Y-m-d')
])->get();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接