Christoffer
Christoffer

Reputation: 492

Paginate through subquery in laravel

The following code will output the 3 first webshops correctly:

public function category($slug) {
    $category = Category::select()
        ->where('slug', $slug)
        ->with(['webshops' => function ($query) {
            $query->groupBy('webshops.id')
                ->where('active', 1)
                ->orderBy('webshops.name')
                ->with(['brands' => function ($query) {
                    $query->where('active', 1)
                        ->where('replace_by', NULL)
                        ->orderBy('name');
                }])
                ->paginate(3);
        }])
        ->first();

    if(!$category)
        abort(404);

    $data['title'] = "Tøjbutikker der forhandler ". $category->name;

    $data['category'] = $category;
    $data['webshops'] = $category->webshops;
    return view('pages/category', $data);
}

Blade template:

                <ul class="webshop-list">
                    @foreach($webshops as $webshop)
                        <li>
                            {{ $webshop->name }}
                        </li>
                   @endforeach
                </ul>
                {{ $webshops->links() }}

But when I insert the pagination code in my blade template:

{{ $category->webshops->links() }}

I get the following error:

Method links does not exist.

I'm following the documentation from here: https://laravel.com/docs/5.4/pagination

Upvotes: 3

Views: 1917

Answers (3)

Alexey Mezenin
Alexey Mezenin

Reputation: 163748

You can create paginator manually, but if you want to keep code maintainable, just use two collections:

$category = Category::where('slug', $slug)->first();
$shops = Webshop::whereHas('categories', function($q) use($category) {
                 $q->where('id', $category->id);
             })
             ->groupBy('id')
             ->orderBy('name')
             ->with(['brands' => function ($query) {
                 $query->where('active', 1)
                       ->where('replace_by', null)
                       ->orderBy('name');
             }])
             ->paginate(3);

Upvotes: 3

decodedxclusive
decodedxclusive

Reputation: 401

make use of the simplePaginate function instead

$category = Category::select()
->where('slug', $slug)
->with(['webshops' => function ($query) {
    $query->groupBy('webshops.id')
    ->orderBy('webshops.name')
    ->with(['brands' => function ($query) {
        $query->where('active', 1)
        ->where('replace_by', NULL)
        ->orderBy('name');
    }])
    ->simplePaginate(3);
}])
->first();

Upvotes: 0

Abdulla Nilam
Abdulla Nilam

Reputation: 38584

Use

{{ $category->links() }}

$category should be your variable name which you're passing to blade.


Example

If you're passing data like this return view('viewName', ['names' => $names]); then you have to use {{ $names->links() }}


Read this Laravel documentation

Upvotes: 0

Related Questions