当在where子句中使用date时,Laravel Eloquent返回空

时间:2017-11-24 14:33:24

标签: php mysql laravel eloquent laravel-5.3

我有简单的模型Archive,这对MySQL表来说很紧张。表具有日期类型的字段日期,以及其他一些字段,如id,title,description等。

如果通过除日期之外的任何其他字段进行查询,我将获得所有期望的结果。到目前为止,模型只返回空结果。

$criteria = array(['prog_i','=',9], ['date','>=','2017-11-01'], ['date','<=','2017-11-11']); 
$offset = 0;

$query = Archive::where($criteria)
                    ->orderBy('date', 'desc')
                    ->skip($offset)
                    ->take(40);

$results = $query->get();
var_dump($results); 

/* object(Illuminate\Database\Eloquent\Collection)#350 (1) { ["items":protected]=> array(0) { } } 
*/

但是,如果我在phpMyAdmin中使用由Laravel(来自调试器)构建的相同查询进行测试,它可以正常工作并返回结果。

select * from `archive` where (`prog_id` = '9' and `date` >= '2017-11-01' and `date` <= '2017-11-11') order by `date` desc limit 40 offset 0

Showing rows 0 - -1 (4 total, Query took 0.3204 seconds.)

可能出现什么问题?

3 个答案:

答案 0 :(得分:0)

您可以尝试 whereDate

$criteria = array(['prog_id','=',9]); 
$criteria_1 = array(['date','>=','2017-11-01'], ['date','<=','2017-11-11']); 
$offset = 0;

$query = Archive::where($criteria)
                    ->whereDate($criteria_1)
                    ->orderBy('date', 'desc')
                    ->skip($offset)
                    ->take(40)
                    ->toSql();<--- add toSql for check your query
print_r($query);

答案 1 :(得分:0)

你应该使用

$query = Archive::where('prog_id','=',9)
  ->whereBetween('date',['2017-11-01','2017-11-11'])
   ->orderBy('date', 'desc')
   ->skip($offset)
    ->take(40);

答案 2 :(得分:0)

你不能为多个where传递数组,但是你可以在内部通过循环传递条件。

$query = Archive::query();
foreach($criteria as $item) {
    $query->where($item[0], $item[1], $item[2]);
}
$query->orderBy('date', 'desc')
    ->skip($offset)
    ->take(40);

$results = $query->get();