Laravel日期比较在Eloquent查询中不起作用

时间:2015-12-12 14:26:21

标签: laravel eloquent laravel-5.1 php-carbon

我不明白为什么但是后面的查询返回null结果集。

due_date是碳日期和$now=Carbon:today();

$subQuery = BillTable::where('busi_id', $business->busi_id)
        ->where('due_date','>=',$now)
        ->where('due_date','<',$now->addMonth())
        ->get();

当我使用whereBetween时,它也无法正常工作。

$subQuery = BillTable::where('busi_id', $business->busi_id)
        ->whereBetween('due_date',[$now, $now->addMonth()])
        ->get();

但是,当我只是大于或小于它的作品时

$subQuery = BillTable::where('busi_id', $business->busi_id)
        ->where('due_date','>',$now->addWeek())
        ->get();

我在这里缺少什么?

2 个答案:

答案 0 :(得分:1)

这里的问题是您在两个范围限制中使用相同的实例。当您致电addMonth时,请将月份添加到$now中存储的实例中。下面的两个例子说明了这个问题:

1。在两个单独的语句中使用和修改相同的变量就像您期望的那样:

$now = Carbon::now();

dump($now); // prints 2015-12-12 14:50:00.000000
dump($now->addMonth); // prints 2016-01-12 14:50:00.000000

2. 使用相同的变量并在将值传递给方法的同一语句中进行修改将以不同的方式工作,因为它将在传递给方法之前进行评估。这意味着两个参数都是相同的,因为它们都包含来自$now变量的相同实例,在获得评估后,它将包含从现在开始一个月的DateTime

$now = Carbon::now();

// Calling `addMonth` will change the value stored in `$now`
dump($now, $now->addMonth());

// The above statement prints two identical DateTime values a month from now:
// 2016-01-12 14:50:00.000000 and 2016-01-12 14:50:00.000000

这意味着您当前的代码正在检查条目是否仅在一个月后完全

要修复它,您需要在两个单独的变量中使用两个实例:

$from = Carbon::now();
$to = Carbon::now()->addMonth();

$subQuery = BillTable::where('busi_id', $business->busi_id)
                     ->whereBetween('due_date',[$from, $to])
                     ->get();

答案 1 :(得分:0)

看起来好像是因为我现在使用了&#39;现在&#39;在查询中。

在查询之前我说$now=Carbon::today();并在查询中使用$now

但后来我摆脱了这个并改变了查询以使用Carbon :: today()它起作用了。

$subQuery = BillTable::where('busi_id', $business->busi_id)
    ->whereBetween('due_date',[Carbon::today(), Carbon::today()->addMonth())
    ->get();

很奇怪。

谢谢,

K