sql >> Base de Datos >  >> RDS >> Mysql

Laravel y múltiples consultas de conteo usando Eloquent

Cada vez que llama a un método estático en su clase de modelo, devuelve una consulta fluida como DB::table('yourmodeltable')->method . Si tienes eso en cuenta, pronto te darás cuenta de que es posible hacer cualquier consulta con los modelos de Eloquent.

Ahora, para lograr un mayor rendimiento, puede usar SQLs FECHA() función. Mi ejemplo a continuación no ha sido probado, así que siéntete libre de corregirlo, por favor.

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

Esto debería imprimir algo como:

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

Editar:

El enfoque sugerido anteriormente devuelve instancias de Eloquent Model, lo que puede parecer extraño, especialmente si var_dump($days) . También puede usar la list() de Fluent método para lograr lo mismo.

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