Abdul Shakoor Kakar
Abdul Shakoor Kakar

Reputation: 611

laravel more than one result from single query

I am trying to get all rows and distinct column from single query. but paginate method is only giving result but not pagination option like total prev next etc..

$offers = Offer::whereHas('users', function ($q) use ($authUser) {
                    $q->where('user_id', $authUser->parent_id);
                    $q->where('publisher_id', '=', $authUser->id);
                });

and distinct column

$websites = $offers->distinct()->get(['website']);

with pivot columns (just wanted to show my full query)

$offers->orderBy($sortBy, $orderBy)->paginate($perPage)->map(function ($offer) {
            if (!empty($offer->users)) {
                $manager = $publisher = '';
                foreach ($offer->users as $user) {
                    $manager   = $user->pivot->user_id;
                    $publisher = $user->pivot->publisher_id;
                }
                $offer->manager   = $manager;
                $offer->publisher = $publisher;
            }
            return $offer;
        });

Return

return response()->json([
            'offers' => $offers,
            'websites' => $websites
        ], 200);

hope my question will make sense. Thanks.

Upvotes: 1

Views: 128

Answers (2)

Christophe Hubert
Christophe Hubert

Reputation: 2951

You should run getCollection() before mapping to get the paginator's underlying collection. (https://laravel.com/api/7.x/Illuminate/Pagination/LengthAwarePaginator.html#method_getCollection)

$offers->orderBy($sortBy, $orderBy)->paginate($perPage)
            ->getCollection()
            ->map(function ($offer) {
            // ...
            return $offer;
        });

Upvotes: 1

Darryl E. Clarke
Darryl E. Clarke

Reputation: 7637

I'm answering based on it being $offers:

Your usage of map() is copying the modified results of your paginate() call to a new collection and that collection does not include the pagination information. That's why you no longer have pagination information.

Since there result of paginate() is already a usable collection, you can use each() instead of map() which will alter the objects in-place.

Upvotes: 0

Related Questions