Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

n1kroS's avatar
Level 1

Incorrect count with right join Laravel 9

Hello, i use Laravel 9 and have issue with records counting. Somebody can explain to me why count = 2, please? Here is my code:

    $request->validate([
        'limit' => 'required|integer|min:1|max:100',
    ]);

    $base_query = Review::rightJoin('excursion_types', 'excursion_types.id', '=', 'reviews.excursion_type_id')
        ->rightJoin('excursions', 'excursions.id', '=', 'excursion_types.excursion_id')
        ->when($request->category, function ($query) use ($request) {
            $query->rightJoin('excursion_categories', 'excursion_categories.excursion_id', '=', 'excursions.id');
            $query->rightJoin('categories', function (JoinClause $join) use ($request) {
                $join->on('categories.id', '=', 'excursion_categories.category_id')
                    ->where('categories.alias', '=', $request->category);
            });
        }, function ($query) {
            $query->rightJoin('excursion_categories', 'excursion_categories.excursion_id', '=', 'excursions.id');
            $query->rightJoin('categories', 'categories.id', '=', 'excursion_categories.category_id');
        })
        ->when($request->city, function ($query) use ($request) {
            $query->rightJoin('city_categories', 'city_categories.category_id', '=', 'categories.id');
            $query->rightJoin('cities', function (JoinClause $join) use ($request) {
                $join->on('cities.id', '=', 'city_categories.city_id')
                    ->where('cities.alias', '=', $request->city);
            });
        })
        ->where('reviews.status', ReviewStatusEnum::ACTIVE->value)
        ->where('reviews.rating', '>=', 4)
        ->groupBy('reviews.id');

    
    $reviews_count = $base_query->count();

    $reviews = $base_query->with('reviewImgs')
        ->select(array_merge(
            ['reviews.*'],
            $request->category ? ['categories.alias as category_alias'] : [],
            $request->city ? ['cities.alias as city_alias'] : []
        ))
        ->orderBy('reviews.created_at', 'desc')
        ->limit($request->limit)
        ->get();

    return [
        'reviews'       => $reviews,
        'reviews_count' => $reviews_count,
    ];

And i get answer from server like:

0 likes
4 replies
n1kroS's avatar
Level 1

@jlrdw How can the same query give different results? The query is the same, but the number of rows is even less than the number of rows by limit

Snapey's avatar

what is reviews_count supposed to represent in relation to your data?

n1kroS's avatar
Level 1

@Snapey $reviews_count - this is the number of all lines according to the condition. That is, I get the number of all lines of reviews and the last 12 reviews.

Please or to participate in this conversation.