2014-04-15 2 views
3

Laravel 페이지 매김은 그룹 단락과 올바르게 작동하지 않는 것 같습니다. 예를 들어 :Laravel 페이지 매김이 그룹 단락과 작동하지 않음

 
      $users = Subject::select(DB::raw('subjects.*, count(user_subjects.id) as total_users')) 
      ->join('user_subjects', 'user_subjects.subject_id', '=', 'subjects.id') 
      ->whereNull('user_subjects.deleted_at') 
      ->groupBy('subjects.id') 
      ->orderBy('subjects.updated_at', 'desc') 
      ->paginate(25); 

는 쿼리에 더 limit 조항이 없다는 것을

 
      select subjects.*, count(user_subjects.id) as total_users 
      from `subjects` inner join `user_subjects` on `user_subjects`.`subject_id` = `subjects`.`id` 
      where `subjects`.`deleted_at` is null and `user_subjects`.`deleted_at` is null 
      group by `subjects`.`id` 
      order by `subjects`.`updated_at` desc 

노트 제작.

작업을 잘 경우 쿼리의 조항에 의해 어떤 그룹 :

 
$users = Subject::select(DB::raw('subjects.*, count(user_subjects.id) as total_users')) 
      ->join('user_subjects', 'user_subjects.subject_id', '=', 'subjects.id') 
      ->whereNull('user_subjects.deleted_at') 
      ->orderBy('subjects.updated_at', 'desc') 
      ->paginate(25); 

다음 쿼리를 생산 :

 
select subjects.*, count(user_subjects.id) as total_users from `subjects` 
      inner join `user_subjects` on `user_subjects`.`subject_id` = `subjects`.`id` 
      where `subjects`.`deleted_at` is null and `user_subjects`.`deleted_at` is null 
      order by `subjects`.`updated_at` desc 
      limit 25 offset 0 

사람이 내가이 문제를 해결할 수있는 방법 어떤 생각을 가지고 있습니까?

+1

왜 그런지는 모르겠지만 그룹 단속기가 Laravel에서 이것을 처리 할 수없는 이유는 확실하지 않습니다. 그것은 기본적으로 전체 집합을 검색하고 PHP 쪽에서 결과를 분할합니다. 이 경우 수동으로 수행하거나 필요한 카운트를 얻는 것이 좋습니다. –

+0

위의 내용은 사실입니다. 코드를 살펴보면 페이징 담당자가 가능한 한 'LIMIT'을 추가하려고 시도하지만 쿼리에 'GROUP BY'가 있으면 바로 모드로 전환됩니다. 모든 결과를 얻고 PHP에서'array_slice'를 사용하여 수동으로 페이지 매김을해야합니다. 나는 페이징 기 클래스를 한 번 둘러보고 실제로 페이징 기가 'LIMIT'을 사용하지 않았지만 그것이 GROUP BY 문일 때만 깨달은 버그라고 생각했습니다. 그래서 예 - 페이징 담당자가 제대로 작동하지 않아야한다는 것을 알게 될 것입니다. 나는 당신이 거대한 결과 세트를 가지지 않기를 바랄뿐입니다! – alexrussell

+0

@alexrussell 감사합니다. 문제는 대용량 데이터 세트를 가지고 있다는 것입니다. (. – Anam

답변

5

확인 문서 현재, groupBy 문을 사용하여 페이지 매김 작업이 Laravel 효율적으로 실행할 수 없습니다 수 https://laravel.com/docs/5.2/pagination

. groupBy과 의 페이지 매김 된 결과 집합을 사용해야하는 경우 데이터베이스 을 쿼리하고 수동으로 페이지 매 개 변수를 만드는 것이 좋습니다.

0

Select(\DB::RAW("assignment_descendant_child.assignment_descendant_child_id, assignment_descendant_child.assignment_descendant_child_name, COUNT(assignment_descendant.assignment_descendant_id) as xNum")) 
      ->leftJoin(
       'assignment_descendant', 
       'assignment_descendant.assignment_descendant_child_id', 
       '=', 
       'assignment_descendant_child.assignment_descendant_child_id' 
      ) 
      ->orderBy('assignment_descendant_child_name') 
      ->groupBy('assignment_descendant_child.assignment_descendant_child_id') 
      ->paginate(\Config::get('constants.paginate_org_index')) 
0

난 당신이 그룹에 의해 원하는 페이지를 매기는 경우이 작동 생각 laravel 5.2에서 나를 위해 작동합니다.

$code = DB::table('sources') 
->select(DB::raw('sources.id_code,sources.title,avg(point) point')) 
->join('rating','sources.id_code','rating.id_code') 
->groupBy('sources.id_code') 
->groupBy('sources.title') 
->groupBy('sources.language') 
->groupBy('sources.visited') 
->groupBy('sources.') 
->paginate(5); 
관련 문제