如何在laravel mongodb eloquent查询中比较日期与mongodb iso日期?

时间:2015-10-08 09:25:22

标签: php mongodb laravel-5

我想从日期大于给定日期的数据中获取记录。但是我在将日期与mongodb iso datetime进行比较时遇到了问题。

目前我正在以Y-m-d格式获取日期,我希望在mongodb格式的查询和日期中进行比较,格式为2015-10-08T08:01:46.000Z

2 个答案:

答案 0 :(得分:6)

Laravel的Eloquent支持Carbon / DateTime对象而不是MongoDate对象,当保存到数据库时,这些对象将在内部转换为MongoDate对象。您可以在您的查询中使用名为 Carbon 的laravel中的此日期处理包。

例如,如果您要查询来自用户数据的记录,其中mongodb日期时间字段created_at大于给定日期(例如今天的记录),请使用Carbon {{3 属性:

$dt = Carbon::now()->startOfDay();
$users = User::where('created_at', '>', $dt)->get();

同样,要进行数据范围查询,即查询特定月份之间的记录,例如2015年10月,请使用 whereBetween 方法:

$users = User::whereBetween(
             'created_at', array(
                 Carbon::createFromDate(2015, 10, 1),
                 Carbon::createFromDate(2015, 10, 31)
             )
         )->get();

另一种方法是使用 startOfDay() ,它允许您使用Carbon / DateTime对象而不是MongoDate对象。示例受到 Eloquent

的启发
<?php

use Jenssegers\Mongodb\Model as Eloquent;

class User extends Eloquent {

    use SoftDeletingTrait;

    /**
     * Collection for Model
     *
     * @var String
     */
    protected $collection = "users";

    /**
     * Connection for model
     *
     * @var type
     */
    protected $connection = 'mongodb';

    protected $dates = array('created_at');
}

允许您执行以下查询:

$users = User::where('created_at', '>', new DateTime('-1 day'))->get();

或者原生使用MongoDate对象,您可以尝试

$start = new MongoDate(strtotime("2015-10-01 00:00:00"));
$stop = new MongoDate(strtotime("2015-10-31 00:00:00"));

$users = DB::collection('users')->whereBetween('created_at', array($start, $stop))->get();

答案 1 :(得分:0)

比较日期的最简单方法是使用Carbon

例如,如果你想从Y-m-d获得,

你可以使用它:

$dt = Carbon::createFromDate(2017,11,7);

其中2017年=年,11 =月,7 =日。根据您所需的日期更换它。

如果您想在当前时间之前获取数据,可以使用

$dt = Carbon::now()

如果您想从当月的第一天开始获取数据,您只需执行以下操作:

$dt = Carbon::now()->startOfMonth();

以下是我在代码中使用的示例:

$device_data = DB::connection('mongodb')
->table('MyRecipe')
->where('data_date', '>', $dt)
->select('*')
->get();

我正在使用https://github.com/jenssegers/laravel-mongodb来访问我的Mongo数据库。