I have an issue when I want to add where clauses to my pagination:
This works fine:
$builder = User::orderBy(
$criteria->getOrderBy(),
$criteria->getOrderWay()
)
->paginate(
$criteria->getPerPage(),
array('*'),
'',
$criteria->getPage()
);
return $builder;
If I want to add where conditions I can if I do the following (it works btw):
$builder = User::orderBy(
$criteria->getOrderBy(),
$criteria->getOrderWay()
)->where(array(array('state','=',0)))
->paginate(
$criteria->getPerPage(),
array('*'),
'',
$criteria->getPage()
);
return $builder;
But If I want to do this without chaining:
$builder = User::orderBy(
$criteria->getOrderBy(),
$criteria->getOrderWay()
);
$builder->where(array(array('state','=',0)));
$builder->paginate(
$criteria->getPerPage(),
array('*'),
'',
$criteria->getPage()
);
return $builder;
I get the following exception:
Call to undefined method Illuminate\Database\Query\Builder::lastPage()
So the pagination is not applied, but why?
How can I add where clauses without duplicating code like this?
$arrClauses = /** example **/;
if(empty($arrClauses)) {
$builder = User::orderBy(
$criteria->getOrderBy(),
$criteria->getOrderWay()
)
->paginate(
$criteria->getPerPage(),
array('*'),
'',
$criteria->getPage()
);
return $builder;
} else {
$builder = User::orderBy(
$criteria->getOrderBy(),
$criteria->getOrderWay()
)->where($arrClauses)
->paginate(
$criteria->getPerPage(),
array('*'),
'',
$criteria->getPage()
);
return $builder;
}
You get the error because you're returning Query Builder instance and not LengthAwarePaginator
instance. Do this to make it work:
$builder = User::orderBy(
$criteria->getOrderBy(),
$criteria->getOrderWay()
);
$builder = $builder->where(array(array('state','=',0)));
$builder = $builder->paginate(
$criteria->getPerPage(),
array('*'),
'',
$criteria->getPage()
);
return $builder;
Your problem is you are not concatenating the query, this should work:
$arrClauses = /** Your clauses **/;
$builder = User::orderBy(
$criteria->getOrderBy(),
$criteria->getOrderWay()
);
if(!empty($arrClauses)) {
$builder = $builder->where($arrClauses);
}
$builder = $builder->paginate(
$criteria->getPerPage(),
array('*'),
'',
$criteria->getPage()
);
return $builder;
Hope this will help you
$builder = User::orderBy(
$criteria->getOrderBy(),
$criteria->getOrderWay()
);
if(!empty($arrClauses))
$builder = $builder->where($arrClauses);
$builder->paginate(
$criteria->getPerPage(),
array('*'),
'',
$criteria->getPage()
);
return $builder;