Итак, в моей базе данных есть таблица под названием «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, я получаю правильные результаты.
Где я ошибаюсь?
внушения: когда MySQL показывает DateTime как '0000-00-00 00: 00: 00' это означает, что это NULL, так попытайтесь использовать' WHERE date_finished НЕ NULL' или, возможно, использовать 'IS NULL' в зависимости от того, что вы хотите – RiggsFolly