2017-04-18 2 views
1

내가 잘 작동이 개 쿼리 결과에 병합 있습니다Laravel에서 get()을 수행 한 후 콜렉션을 페이지 매김하는 방법은 무엇입니까?

$events1 = \App\Event::Where('valid_to','>=',$today)->orderByRaw('valid_to','ASC')->get(); 
$events2 = \App\Event::Where('valid_to','<',$today)>orderByRaw('valid_to','ASC')->get(); 
$events = $events1->merge($events2); 

지금 나는이 새 컬렉션 페이지를 매기는 필요하고 suggestted 나는이 부분을 추가 :

$page = 1; 
$perPage = 60; 
$pagination = new \Illuminate\Pagination\LengthAwarePaginator(
    $events->forPage($page, $perPage), 
    $events->count(), 
    $perPage, 
    $page 
); 

편집 : 미래의 독자를 들면, 패트리 쿠스의 답변은 훌륭하게 작동했습니다.

답변

4

당신은 잘못된 개체에 links()render()을 호출하고 있습니다. 당신은 $pagination 변수에 페이징기를 지정했습니다. 당신은 단지 하나 개의 쿼리를하지 않도록 당신이, 당신이 당신의 쿼리를 수정할 수 있습니다 약간이를 정리하려는 경우 당신은 또한

$pagination->links() 

또는

$pagination->render() 

를 호출한다 두 개의 서로 다른 결과 세트를 결합해야합니다. 날짜 비교 결과를 먼저 주문한 다음 valid_to 필드에 주문하면됩니다.

$events = \App\Event::orderByRaw('valid_to < ?', [$today])->orderBy('valid_to')->get(); 

날짜 비교는 true/false 결과를 반환합니다. ASC 순서 (지정되지 않은 경우 기본값)에서 false 결과 뒤에 true 결과가 오므로 valid_to (만료 됨)보다 작은 행은 valid_to$today 이상인 행 뒤에옵니다.

그 결과 집합은 valid_to 필드 자체에 의해 정렬됩니다. 이 하나의 쿼리는 수동으로 병합 한 두 개의 쿼리와 동일한 결과를 제공합니다. 그리고, 물론, 당신은 단지이 하나의 쿼리 페이지를 매기는 할 수

$events = \App\Event::orderByRaw('valid_to < ?', [$today])->orderBy('valid_to')->paginate(60); 

이제, 당신이 $events->links()$events->render()을 사용할 것이다, 그래서 매겨진 당신의 $events 개체입니다.

+0

답장을 보내 주셔서 감사합니다. 나는 그것을했고 $ page = 1이 작동하는 한 $ page = 2를 디버깅 할 때 뭔가 잘못되어 "non-object (View : ...)의 속성을 얻으려고합니다." 어떤 비 - 객체가 문제를 일으키는 지 찾으려고합니다. – user7432810

관련 문제