2

使用 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)不允许我date直接使用 Carbon 对象查询列。

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

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

2 回答 2

9

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

从文档:

默认情况下,Eloquent 会将 created_at、updated_at 和 deleted_at 列转换为 Carbon 的实例,它提供了各种有用的方法,并扩展了原生的 PHP DateTime 类。

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

同样,以正确的格式 (Ymd) 提供日期可能仍然是必要的,因为并不总是可以告诉如何解释给定的日期

于 2013-10-09T14:51:07.727 回答
1

如此处所述,Laravel 使用 Carbon 作为 DateTime 类,您可以使用以下方法执行它:

Model::whereDate( \Carbon\Carbon::now()->subDays(2) )->get();
于 2013-10-09T14:57:35.243 回答