使用Laravel的查询构建器查询日期列

时间:2013-10-09 14:44:25

标签: php laravel laravel-4 eloquent

使用Laravel查询构建器对具有日期列的表编写查询时,应使用哪种数据类型?以下应该返回13个结果,但不返回任何内容:

$date = new \DateTime("-2 days");
Model::whereDate($date)->get();

转储查询显示laravel正在尝试此操作:

array(3) {
  'query' =>
  string(62) "select * from `table` where `date` = ?"
  'bindings' =>
  array(1) {
    [0] =>
    class DateTime#310 (3) {
      public $date =>
      string(19) "2013-10-07 14:39:11"
      public $timezone_type =>
      int(3)
      public $timezone =>
      string(3) "UTC"
    }
  }
  'time' =>
  double(5.55)
}

将查询编写为Model::whereDate($date->format("Y-m-d"))->get()而不是有效,但似乎不像Laravel那样做。

是否有特定的对象类型我应该传递给查询以按日期列过滤?

编辑:此示例中的模型如下所示:

class Model extends Eloquent {
    protected $table = 'table';

    public function getDates() {
        return array('date');
    }
}

它所指的表看起来像这样:

CREATE TABLE table(
  some_field VARCHAR(255),
  date DATE
) ENGINE = 'InnoDB';

Laravel认为日期列是一个字符串:Model::lists('date')返回一个字符串数组,DB::table('table')->lists('date')也是如此。

$date = new \DateTime("-2 days");更改为$date = \Carbon\Carbon::now()->subDays(2)不允许我直接使用Carbon对象查询date列。

更新:无论出于何种原因,内置MySQL date\Carbon\Carbon对我不起作用,所以最简单的解决方案是将一个作为查询编写范围:

public function scopeDate($query, \Carbon\Carbon $date) {
    return $query->whereDate($date->toDateString());
}

2 个答案:

答案 0 :(得分:9)

您应该在getDates()数组中添加列。通过这样做,Eloquent会自动将您的日期时间转换为Carbon对象。

来自文档:

  

默认情况下,Eloquent会转换created_at,updated_at和   deleted_at列到Carbon的实例,它提供了一个   各种有用的方法,并扩展本机PHP DateTime   类。

看到这个: http://laravel.com/docs/eloquent#date-mutators

同样,以正确的格式(Y-m-d)提供日期可能仍然是必要的,因为并不总是能够说出如何解释给定的日期

答案 1 :(得分:1)

正如在这里所说,Laravel使用Carbon作为DateTime类,您可以使用:

执行它
Model::whereDate( \Carbon\Carbon::now()->subDays(2) )->get();