Laravel Eloquent whereDate()with UnixTimestamps

时间:2017-05-11 07:28:24

标签: php laravel laravel-5

我的数据库中的条目具有自定义时间戳字段(例如1488446089)。 如何将whereDate()或whereDay()与unix timstamps一起使用?

这当然适用于日期字段。

$posts = Post::whereDay('uploaded_time', '=', '2017-05-10')->get();

2 个答案:

答案 0 :(得分:1)

要正确运行,请使用whereDate代替whereDay

$posts = Post::whereDate('uploaded_time', '2017-05-10')->get();

获取所有特定日期(月份日期,如1-30

$posts = Post::whereDay('uploaded_time', '10')->get();//provide date of month

获取更多详细信息:https://laravel.com/docs/master/queries#where-clauses

答案 1 :(得分:1)

执行此操作的一种方法是获取所有帖子,然后在PHP中过滤结果:

    $myDate = '2017-05-10';

    $posts = Post::all()->filter(function (Post $post) use ($myDate) {
        $uploadedAt = Carbon::createFromTimestamp($post->uploaded_time)->format('Y-m-d');
        return $uploadedAt === $myDate;
    });

为什么呢?因为如果我是对的,您正在尝试获取在某个日期上传的所有帖子。这意味着有一系列时间戳有效。 (60 * 60 * 24)。使用Carbon(Laravel附带),您可以轻松地将时间戳转换为Y-m-d格式化的字符串。那些你然后比较你选择的日期字符串。

修改

我目前无法对此进行测试,但毕竟应该可以使用查询构建器执行此操作:

$myDate = Carbon::createFromFormat('Y-m-d', '2017-05-10');
$startOfDayTimestamp = $myDate->startOfDay()->timestamp;
$endOfDayTimestamp = $myDate->endOfDay()->timestamp;

$posts = Post::whereBetween('uploaded_time', [
    $startOfDayTimestamp,
    $endOfDayTimestamp
])->get();

这里我们创建了2个时间戳,一个用于您希望过滤的日期的开头,另一个用于最后一个。之后,我们可以使用构建器的whereBetween()方法并传递2个时间戳。

I found this solution here,并使用setTime()startOfDay方法替换endOfDay次来简化了一点。