Za każdym razem, gdy wywołujesz metodę statyczną w klasie modelu, zwraca ona zapytanie Fluent, takie jak DB::table('yourmodeltable')->method
. Jeśli będziesz o tym pamiętać, wkrótce zdasz sobie sprawę, że za pomocą modeli Eloquent można wykonać dowolne zapytanie.
Teraz, aby osiągnąć większą wydajność, możesz użyć SQLs DATA() funkcjonować. Mój przykład poniżej nie został przetestowany, więc możesz go poprawić.
// tomorrow -1 week returns tomorrow's 00:00:00 minus 7 days
// you may want to come up with your own date tho
$date = new DateTime('tomorrow -1 week');
// DATE(objecttime) turns it into a 'YYYY-MM-DD' string
// records are then grouped by that string
$days = Object::where('objecttime', '>', $date)
->group_by('date')
->order_by('date', 'DESC') // or ASC
->get(array(
DB::raw('DATE(`objecttime`) AS `date`'),
DB::raw('COUNT(*) as `count`')
));
foreach ($days as $day) {
print($day->date . ' - '. $day->count);
}
Powinno to wydrukować coś takiego:
2013-03-09 - 13
2013-03-10 - 30
2013-03-11 - 93
2013-03-12 - 69
2013-03-13 - 131
2013-03-14 - 185
2013-03-15 - 69
Edytuj:
Sugerowane powyżej podejście zwraca instancje Eloquent Model, co może wydawać się dziwne, szczególnie jeśli var_dump($days)
. Możesz także użyć funkcji list()
Fluenta metoda na osiągnięcie tego samego.
$date = new DateTime('tomorrow -1 week');
// lists() does not accept raw queries,
// so you have to specify the SELECT clause
$days = Object::select(array(
DB::raw('DATE(`objecttime`) as `date`'),
DB::raw('COUNT(*) as `count`')
))
->where('created_at', '>', $date)
->group_by('date')
->order_by('date', 'DESC') // or ASC
->lists('count', 'date');
// Notice lists returns an associative array with its second and
// optional param as the key, and the first param as the value
foreach ($days as $date => $count) {
print($date . ' - ' . $count);
}