Laravel数据库查询返回错误的值

时间:2016-10-19 14:51:26

标签: php mysql laravel laravel-4 eloquent

所以在我的数据库中,我有一个名为“records”的表,其中包含大约1k个条目。此表包含“id”,“title”,“date_finished”,“category_id”,“user_id”等字段。

date_finished”默认为0000-00-00 00:00:00,但用户可以将其更改为当前时间戳。因此,在此表中,大约一半有默认date_finished,另一半有自定义。

在我的HTML中,我input type="month",其中年份和月份以“2016-10”的格式发送给控制器。

我只需要获得那些具有默认date_finished属性或date_finished的条目,其中包含从输入中收到的月份和年份。

在我的控制器的开头,我写了

$record_query =  DB::table('records');

然后,我需要一些额外的选项,所以我有两个数组 - $ users和$ categories包含一些id。然后,我做

$record_query = $record_query
       ->where(function($q) use ($users){ $q->whereIn('records.user_id', $users); })
       ->orWhere(function($q) use ($categories){                
            $q->whereIn('records.category_id', $categories);
        });

之后我从1k剩下大约700个条目。

以下是问题所在的部分。

要获得满足上述要求的条目,我会

$month = Input::get('month');
$record_query = $record_query->where(function($w) use($month){
      $w->where('records.date_finished','0000-00-00 00:00:00')
      ->orWhere(function($q) use ($month){                
            $q->where('records.date_finished','!=','0000-00-00 00:00:00')
           ->whereBetween('records.date_finished',array(date('Y-m-d', strtotime($month)), date('Y-m-d', strtotime($month.'+1 month'))));
       });
});

在这次修改之后,我得到了大约300个不符合这些要求的条目。我得到的数组包含一些默认date_finished和自定义date_finished的随机条目,这些条目与我从输入发送的条目没有任何共同之处。

当我直接在SQL中运行相同的查询时,我得到了正确的结果。

我哪里错了?

1 个答案:

答案 0 :(得分:1)

我认为你需要像

这样的东西
$date = Carbon::createFromDate(null, $month, null);

$record_query = $record_query->where(function($w) use($date){
    $w->where('records.date_finished','0000-00-00 00:00:00')
        ->orWhere(function($q) use ($date){                
            $q->whereBetween('records.date_finished', [$date->toDateString(), $date->addMonth()->toDateString()])));
   });
});