2013-01-15 9 views
8

Chcę zwrócić wszystkie wiersze w tabeli bazy danych, które są na dzień lub wcześniej. Używam Laravel 4. To, co próbowałem:Laravel/Wymowne i porównujące daty

$date = date('Y-m-d H:i:s'); 
return MainContact::where(DATEDIFF('timestamp', $date), '<=', 1)->get(); 

To nie działa. Przeczytałem dokumentację i nie wygląda na to, że możesz przekazać funkcje Laravel MySQL. timestamp to pole datetime. Jak mogę porównać te daty w Laravel 4?

Odpowiedz

9

odpowiedź, że user1977808 dał ci nie jest dobrze, ponieważ MySQL nie może używać indeksu w kolumnie znacznika czasu, ponieważ musi obliczyć wynik funkcji DATE_SUB dla każdego wiersza. Unikaj takich zapytań, za każdym razem muszą przetwarzać całą tabelę!

Jak o coś takiego:

return MainContact::where('timestamp', '>=', time() - (24*60*60))->get(); 

Włożyłem >= tam dlatego, że powiedział „dzień lub mniej stare”, więc muszą mieć znacznik czasu, który jest później niż wczoraj.

+0

Tak, musiałem dostosować jego MySQL. – sehummel

+2

Zrobiłem 'MainContact :: where ('timestamp', '>', DB :: raw ('NOW() - INTERVAL'. $ Interval. 'DAY') -> get();', a następnie przekazane w interwale – sehummel

+2

Możesz również użyć 'strtotime (" - 1 day ")', tak: 'MainContact :: where ('timestamp', '>' strtotime (" - {$ interval} day ")) -> get(); ' –

0

Można również zrobić surowego zapytanie za pomocą:

$results = DB::query('query'); 

Ty tylko nie zrobić modelu obiektowego z powrotem w wynikach var

+0

Tak, jest to podejście Pracuję teraz. – sehummel

+0

Miałem nadzieję, że był lepszy sposób. – sehummel

2
return MainContact::where('timestamp', '>=', time() - (24*60*60))->get(); 
+0

Skończyło się na zrobieniu czegoś bardzo podobnego. – sehummel

0

Można również użyć whereDate(), whereDay(), whereMonth() i whereYear(). W tym przypadku, whereDate() mogłyby zostać użyte jako takie, z prostych funkcji daty Carbon:

return MainContact::whereDate('dateField', '<', Carbon::now()->subDay())->get();