【问题标题】:Querying a date column with Laravel's query builder使用 Laravel 的查询构建器查询日期列
【发布时间】:2013-10-09 14:44:25
【问题描述】:

当使用 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());
}

【问题讨论】:

  • 我在这里有点困惑。它在标题中说查询生成器,但您用 eloquent 标记。那么您使用的是哪种方法?
  • @itachi:使用基于表的 Eloquent 模型并进行直接查询,即DB::table('table') 都表现出我在问题中提到的行为。

标签: php laravel laravel-4 eloquent


【解决方案1】:

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

来自文档:

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

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

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

【讨论】:

  • 似乎提供正确的格式是我唯一的选择,但我不明白为什么解释 MySQL date 类型的列会有任何问题。 Eloquent 和查询构建器似乎都无法将 date 类型与 \DateTime\Carbon\Carbon 进行比较。
【解决方案2】:

正如这里所说,Laravel 使用 Carbon 作为 DateTime 类,您可以使用以下方法执行它:

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

【讨论】:

  • 这仍然行不通,但Model::whereDate(\Carbon\Carbon::now()->subDays(2)->toDateString())->get(); 可以。
  • 当我发帖时它在这里为我工作。请您使用 QueryBuilder 对其进行测试好吗? >> DB::table('table')->whereDate( $date )->get(); 可能是 Eloquent 的一个错误。
  • 在QueryBuilder中也是一样的。我应该提一下,该站点使用的是 PHP 5.3.3(CentOS 软件包存储库中提供的最新版本),因此很可能是兼容性问题。
  • whereDate 方法在源代码中的位置在哪里?
  • @RubensMariuzzo whereDate 是动态范围的。你可以在 Laravel 中做到这一点:whereCOLUMN($value) 这基本上是 where('COLUMN', '=', $value) 的简写
猜你喜欢
  • 2018-07-03
  • 2023-03-13
  • 1970-01-01
  • 2017-06-29
  • 2021-06-05
  • 2013-02-23
  • 1970-01-01
  • 2021-09-25
  • 1970-01-01
相关资源
最近更新 更多