如何用Laravel Eloquent计算每行数据与当前日期的时间差?
如何用Laravel Eloquent计算当前日期与created_at的日期差并统计天数?
没问题,这需求用Eloquent其实有几种实现方式,我给你对应你原生SQL的方案,还有更贴合Laravel风格的做法:
方案1:直接对应原生SQL的写法(数据库层面计算)
如果你想完全沿用原生SQL里用unix_timestamp计算秒级时间差的逻辑,用selectRaw就能直接实现,代码简洁且和原生逻辑完全对齐:
// 筛选trial=1的用户,同时在数据库层面计算时间差 $users = User::where('trial', 1) ->selectRaw('unix_timestamp(NOW()) - unix_timestamp(created_at) AS time_diff') ->get(); // 遍历获取每个用户的时间差 foreach ($users as $user) { $diffInSeconds = $user->time_diff; // 如果需要转成天数,直接除以一天的秒数(86400)即可,用floor取整得到完整天数 $diffInDays = floor($diffInSeconds / 86400); }
如果还需要同时获取用户的其他字段,把*加进selectRaw里就行:
$users = User::where('trial', 1) ->selectRaw('*, unix_timestamp(NOW()) - unix_timestamp(created_at) AS time_diff') ->get();
方案2:用Laravel的DB::raw实现(和方案1逻辑一致)
另一种写法是用DB::raw包裹SQL片段,适合需要精准指定要查询的字段的场景:
use Illuminate\Support\Facades\DB; $users = User::where('trial', 1) ->select([ 'id', 'name', // 明确指定你需要的用户字段 DB::raw('unix_timestamp(NOW()) - unix_timestamp(created_at) AS time_diff') ]) ->get();
方案3:用Carbon在PHP层面计算(更灵活的Laravel风格)
Laravel默认会把模型的created_at字段转换成Carbon实例,所以你也可以在查询完数据后,用Carbon的时间差方法来计算,这种方式更灵活,适合需要对时间差做复杂处理的场景:
$users = User::where('trial', 1)->get(); foreach ($users as $user) { // 直接获取两个日期的天数差 $diffInDays = now()->diffInDays($user->created_at); // 如果需要秒级时间差 $diffInSeconds = now()->diffInSeconds($user->created_at); // 还能获取包含年、月、日的完整时间差信息 $fullDiff = now()->diff($user->created_at); }
小贴士:如果你的数据量比较大,优先用方案1或2,因为是在数据库层面完成计算,性能会更好;如果需要对时间差做更多个性化处理,方案3的Carbon工具会更顺手。
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

