Reputation: 1658
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
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
Reputation: 1719
$query = Product::find(1)->get()->options()->paginate();
Try adding get
Upvotes: -4
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