2015-04-24 3 views
3

Am пытается фильтровать постраничную красноречивую коллекцию, но всякий раз, когда я использовать любого из методов сбора, я теряю PAGINATIONфильтрация постраничного красноречивого коллекции

$models = User::orderBy('first_name','asc')->paginate(20); 

$models = $models->each(function($model) use ($filters) { 
    if(!is_null($filters['type'])) { 
     if($model->type == $filters['type']) 
      return $model; 
    } 

    if(!is_null($filters['state_id'])) { 
     if($model->profile->state_id == $filters['state_id']) 
      return $model; 
    } 

    if(!is_null($filters['city_id'])) { 
     if($model->profile->city_id == $filters['city_id']) 
      return $model; 
    } 
}); 

return $models; 

Am работает с Laravel 4.2, есть ли способ сохраняться разбиение на страницы?

+2

Почему бы вам не сделать фильтр перед пагинацией? – mininoz

+0

@mininoz вы имеете в виду вручную paginate? – MrFoh

+0

Это означает, что ВЫБРАТЬ только для пользователей с нужным типом и без нулевого города и состояния, а не для разбивки на страницы. – vanadium23

ответ

4

Развивая ответ mininoz с вашим конкретным случаем:

//Start with creating your object, which will be used to query the database 

$queryUser = User::query(); 

//Add sorting 

$queryUser->orderBy('first_name','asc'); 

//Add Conditions 

if(!is_null($filters['type'])) { 
    $queryUser->where('type','=',$filters['type']); 
} 

if(!is_null($filters['state_id'])) { 
    $queryUser->whereHas('profile',function($q) use ($filters){ 
     return $q->where('state_id','=',$filters['state_id']); 
    }); 
} 

if(!is_null($filters['city_id'])) { 
    $queryUser->whereHas('profile',function($q) use ($filters){ 
     return $q->where('city_id','=',$filters['city_id']); 
    }); 
} 

//Fetch list of results 

$result = $queryUser->paginate(20); 

Применяя надлежащие условия для вашего запроса, вы ограничиваете количество информации, которая приходит назад на ваш PHP-скрипт и, следовательно, ускорить процесс.

Источник: http://laravel.com/docs/4.2/eloquent#querying-relations

1

paginate() является функцией Builder. Если у вас уже есть объект Collection, то он не имеет функции paginate(), поэтому вы не можете легко его вернуть.

Один из способов решения состоит в том, чтобы иметь другой строитель, где вы создаете запрос, поэтому вам не нужно его фильтровать позже. Eloquent query builder достаточно мощный, возможно, вы можете его отключить.

Другой вариант - создать собственный пользовательский paginator.

+0

Спасибо за подсказку – MrFoh

1

Вы можете сделать запрос на своей модели перед тем, как сделать paginate.

Я хотел бы дать вам некоторую идею. Я получу all users by type, sort их и сделаю paginate в конце. Код будет выглядеть следующим образом.

$users = User::where('type', $filters['type'])->orderBy('first_name','asc')->paginate(20); 

Источник: http://laravel.com/docs/4.2/pagination#usage

Смежные вопросы