Steve Chamaillard
Steve Chamaillard

Reputation: 2339

Laravel 5 ; Using count on already filtered data without altering it

I'm running this code on Laravel. I'm adding filters/ordering if I receive them and I'm altering the query before running it and then paginate the results.

$aDatas = DB::table('datas');

if (!empty($aLocations)) {
    foreach ($aLocations as $oLocation) {
        $aDatas->orWhere('pc', '=', $oLocation->pc);
    }
}

if (!empty($oFilters->note)) {
    $aDatas->where('note', '>=', $oFilters->note);
}

if (!empty($oFilters->nb_comments)) {
    $aDatas->where('nb_comments', '>=', $oFilters->nb_comments);
}

if (!empty($oOrder->type)) {
    $aDatas->orderBy($oOrder->type, $oOrder->sort);
}

// echo $aDatas->where('note', '>=', 5)->count() ????

It's working fine. But I'd like to use these results to count several parts of it. The last line shows what I tried to do, counting how many rows in these filtered results have a note >= 5. But doing this will actually filter my original data.

I thought about assigning $aDatas to another variable and then count on this, but I'll have many counts and that seems dirty.

Is there a sweet way to do this ?

Upvotes: 2

Views: 2532

Answers (2)

rfpdl
rfpdl

Reputation: 964

For all of your requirement, you might want to resolve in making several queries because a single query will not be able to do that(based from what I know)

//this is to get your total of note greater than 5
$query = DB::table('datas');
$query->where('note', '>=', 5);
$data = $query->paginate(10);

$count = $data->getTotal();

to get your other data

If you are working with pagination, use getTotal() instead

$query = DB::table('datas');
$query->select(
    DB::raw('COUNT(stars) AS count'),
    DB::raw('starts'),
);
$query->where('notes', '>=', 5);
$query->groupBy('stars');
$data = $query->get();

Upvotes: 0

cre8
cre8

Reputation: 13562

Just save your datas an replace the last line with this:

$datas =$aDatas->where('note', '>=', 5)->get();
echo $datas->count();

//use datas here for more action.

Upvotes: 1

Related Questions