2016-10-19 6 views
0

Итак, в моей базе данных есть таблица под названием «records», которая содержит приблизительно 1k записей. В этой таблице содержатся такие поля, как «id», «title», «date_finished», «category_id», «user_id» и некоторые другие.Запрос базы данных Laravel возвращает неверные значения

«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'); 

Затем мне нужно некоторые дополнительные опции, которые будут использоваться, поэтому у меня есть два массива - $ пользователей и $ категории, содержащие некоторые идентификаторы. Затем я делаю

$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); 
     }); 

И после этого у меня около 700 записей осталось от 1k.

И вот та часть, где проблема.

Чтобы получить только те записи, которые удовлетворяют требованиям, указанным выше, я

$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

внушения: когда MySQL показывает DateTime как '0000-00-00 00: 00: 00' это означает, что это NULL, так попытайтесь использовать' WHERE date_finished НЕ NULL' или, возможно, использовать 'IS NULL' в зависимости от того, что вы хотите – RiggsFolly

ответ

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()]))); 
    }); 
}); 
Смежные вопросы