Jen Zhang
Jen Zhang

Reputation: 1658

Laravel Eloquent pagination on relationships

I am trying to paginate a Eloquent relationship like this:

 $query = Product::find(1)->options()->paginate();

But I get the following error:

Fatal error: Call to a member function getCurrentPage() on a non-object

I have confirmed that the code $query = Product::find(1)->options() returns a collection of options. The $query object seems to be of type hasMany. Below are the model classes I am using.

class Product extends Eloquent
{

    protected $table = 'products';

    public function options ()
    {
        return $this->hasMany('ProductOption', 'product_id');
    }
}

class ProductOption extends Eloquent
{
    protected $table = 'product_options';

    public function product()
    {
        return $this->belongsTo('Product', 'product_id');
    }
}

Does eloquent not return paginated results for relationships?

Upvotes: 7

Views: 6835

Answers (3)

petewarrior
petewarrior

Reputation: 31

Create a custom length-aware paginator.

$options = new LengthAwarePaginator(Product::find(1)->options()->
            ->skip(($request->input('page', 1) - 1) * 10)->take(10)->get(),
            Product::find(1)->options()->count(), 
            10, $request->input('page', 1),
            [
                // paginator options here
            ]);

Upvotes: 0

ErikBrandsma
ErikBrandsma

Reputation: 1719

$query = Product::find(1)->get()->options()->paginate(); 

Try adding get

Upvotes: -4

41eight
41eight

Reputation: 191

You can not lazy load relational pagination like that, instead in your Product Model put the following function below your options has many relationship

public function getOptionsPaginatedAttribute()
{
    return $this->options()->paginate(10);
}

This will allow you to call the pagination on your relational data by

$product->options_paginated

Upvotes: 17

Related Questions