分页和where子句

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;