2015-12-12 1 views
2

Я не понимаю, почему, но следующий запрос возвращает нулевой набор результатов.Laravel Сравнение дат не работает в запросе на запрос Eloquent

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(); 

Что я здесь отсутствует?

+0

Это было бы глупо с моей стороны, если я не проверял, что уже. Спасибо, что указали это, но это не причина. – karmendra

+1

log $ now, потому что иногда mysql и php не синхронизируются. Mysql может иметь локальное время, а php будет использовать UTC. –

+0

Я только что нашел это, спасибо. – karmendra

ответ

0

Проблема в том, что вы используете один и тот же экземпляр для обоих пределов диапазона. Когда вы вызываете 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(); 
+0

Теперь, когда это работает, возможно иметь разные диапазоны дат и группировать их с именем «сегодня», «nextweek», «priviousweek» и т. Д. В одном запросе.Я сделал это в SQL, но не смог написать красноречивым, и я хочу использовать красноречивый, чтобы иметь возможность использовать Carbon (помогает с часовым поясом). – karmendra

+0

Я не знаю, как объяснить это '$ subQuery = BillTable :: where ('busi_id', $ business-> busi_id) \t \t -> -> select (DB :: raw ('count (*) as count ')) -> whereBetween (' due_date ', [$ now, $ now-> addMonth()]) В качестве rangename \t -> гдеBetween (' due_date ', [$ now, $ now-> addMonth()]) Как rangename \t \t -> группеПо ('') rangename -> получить() ' – karmendra

+0

Я использовал следующий SQL случай' DB :: сырец ("сЛУЧАЙ \t \t \t \t \t \t КОГДА (TO_DAYS (invd_invoiceduedate) = to_days (now())) \t \t \t \t \t \t ТОГДА 'due_today' \t \t \t \t \t \t КОГДА (TO_DAYS (invd_invoiceduedate) между (TO_DAYS (в настоящее время()) - 7) и TO_DAYS (в настоящее время())) \t \t \t \t \t \t ТОГДА '' overdue_7_days \t \t \t \t \t \t КОГДА (TO_DAYS (invd_invoiceduedate) между (TO_DAYS (в настоящее время()) - 15) и (TO_DAYS (в настоящее время()) - 8))\t \t \t \t \t \t ТОГДА '' overdue_8_to_15_days \t \t \t \t \t \t КОНЕЦ invoice_age, сумма (invd_invoicetotal) в качестве invoice_sub_total "))', чем группы по invoice_age. – karmendra

0

Похоже, это потому, что я использовал «$ теперь» в запросе.

Как сказано перед запросом, я сделал $now=Carbon::today(); и использовал $now в запросе.

Но потом я избавился от этого и изменил запрос на использование Carbon :: today().

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

Странно.

Спасибо,

K

+0

Я только что опубликовал ответ, почему это минута назад :). – Bogdan

 Смежные вопросы

  • Нет связанных вопросов^_^