【发布时间】: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