2014-02-18 3 views
1

데이터베이스 쿼리 후에 모음을 가져옵니다. 그런 다음 closure 콜백을 전달하여 그룹화합니다. 그리고 나서 마지막으로 배열을 정렬하기 위해 클로저 콜백을 전달하는 각각을 사용하여 콜렉션에서 그룹화 된 배열을 정렬하고 싶습니다. 그러나 일하지 마라. 어쩌면 그것은 을 어떻게 보호 할 수 있습니까?Laravel 컬렉션의 정렬 그룹 배열

PostController에서 내 코드

$post->comments = $post->comments->groupBy(function($comment){ 
    return $comment->parent_id == null ? "-1": $comment->parent_id; 
})->each(function($comment){ 
    // TODO: sort array 
    uasort($comment, function($a, $b){ 
     return $a->created_at->lte($b->created_at)? 1: -1; 
    }); 
    return $comment; 
}); 
    Debugbar::info($post->comments); 

정보는 $ 포스트>의 생성 날짜에 의해 주문되지

Illuminate\Database\Eloquent\Collection Object 
(
    [items:protected] => Array 
     (
      [-1] => Array 
       (
        [0] => Comment Object 
         (
          [table:protected] => comments 
          [fillable:protected] => Array 
           (
            [0] => id 
           ) 

          [connection:protected] => 
          [primaryKey:protected] => id 
          [perPage:protected] => 15 
          [incrementing] => 1 
          [timestamps] => 1 
          [attributes:protected] => Array 
           (
            [id] => 1 
            [user_id] => 4 
            [post_id] => 1 
            [parent_id] => 
            [comment] => Eligendi ipsum saepe qui velit laudantium. 
            [created_at] => 2013-11-06 13:28:49 
            [updated_at] => 2013-11-06 13:28:49 
           ) 

          [original:protected] => Array 
           (
            [id] => 1 
            [user_id] => 4 
            [post_id] => 1 
            [parent_id] => 
            [comment] => Eligendi ipsum saepe qui velit laudantium. 
            [created_at] => 2013-11-06 13:28:49 
            [updated_at] => 2013-11-06 13:28:49 
           ) 

          [relations:protected] => Array 
           (
           ) 

          [hidden:protected] => Array 
           (
           ) 

          [visible:protected] => Array 
           (
           ) 

          [appends:protected] => Array 
           (
           ) 

          [guarded:protected] => Array 
           (
            [0] => * 
           ) 

          [dates:protected] => Array 
           (
           ) 

          [touches:protected] => Array 
           (
           ) 

          [observables:protected] => Array 
           (
           ) 

          [with:protected] => Array 
           (
           ) 

          [exists] => 1 
          [softDelete:protected] => 
         ) 

        [1] => Comment Object 
         (
          [table:protected] => comments 
          [fillable:protected] => Array 
           (
            [0] => id 
           ) 

          [connection:protected] => 
          [primaryKey:protected] => id 
          [perPage:protected] => 15 
          [incrementing] => 1 
          [timestamps] => 1 
          [attributes:protected] => Array 
           (
            [id] => 2 
            [user_id] => 63 
            [post_id] => 1 
            [parent_id] => 
            [comment] => Aperiam ut molestiae. 
            [created_at] => 2013-08-18 00:15:24 
            [updated_at] => 2013-08-18 00:15:24 
           ) 

          [original:protected] => Array 
           (
            [id] => 2 
            [user_id] => 63 
            [post_id] => 1 
            [parent_id] => 
            [comment] => Aperiam ut molestiae. 
            [created_at] => 2013-08-18 00:15:24 
            [updated_at] => 2013-08-18 00:15:24 
           ) 

          [relations:protected] => Array 
           (
           ) 

          [hidden:protected] => Array 
           (
           ) 

          [visible:protected] => Array 
           (
           ) 

          [appends:protected] => Array 
           (
           ) 

          [guarded:protected] => Array 
           (
            [0] => * 
           ) 

          [dates:protected] => Array 
           (
           ) 

          [touches:protected] => Array 
           (
           ) 

          [observables:protected] => Array 
           (
           ) 

          [with:protected] => Array 
           (
           ) 

          [exists] => 1 
          [softDelete:protected] => 
         ) 

        [2] => Comment Object 
         (
          [table:protected] => comments 
          [fillable:protected] => Array 
           (
            [0] => id 
           ) 

          [connection:protected] => 
          [primaryKey:protected] => id 
          [perPage:protected] => 15 
          [incrementing] => 1 
          [timestamps] => 1 
          [attributes:protected] => Array 
           (
            [id] => 3 
            [user_id] => 4 
            [post_id] => 1 
            [parent_id] => 
            [comment] => Doloribus ipsa velit unde veritatis qui. 
            [created_at] => 2013-09-20 05:19:45 
            [updated_at] => 2013-09-20 05:19:45 
           ) 

          [original:protected] => Array 
           (
            [id] => 3 
            [user_id] => 4 
            [post_id] => 1 
            [parent_id] => 
            [comment] => Doloribus ipsa velit unde veritatis qui. 
            [created_at] => 2013-09-20 05:19:45 
            [updated_at] => 2013-09-20 05:19:45 
           ) 

          [relations:protected] => Array 
           (
           ) 

          [hidden:protected] => Array 
           (
           ) 

          [visible:protected] => Array 
           (
           ) 

          [appends:protected] => Array 
           (
           ) 

          [guarded:protected] => Array 
           (
            [0] => * 
           ) 

          [dates:protected] => Array 
           (
           ) 

          [touches:protected] => Array 
           (
           ) 

          [observables:protected] => Array 
           (
           ) 

          [with:protected] => Array 
           (
           ) 

          [exists] => 1 
          [softDelete:protected] => 
         ) 

        [19] => Comment Object 
         (
          [table:protected] => comments 
          [fillable:protected] => Array 
           (
            [0] => id 
           ) 

          [connection:protected] => 
          [primaryKey:protected] => id 
          [perPage:protected] => 15 
          [incrementing] => 1 
          [timestamps] => 1 
          [attributes:protected] => Array 
           (
            [id] => 27 
            [user_id] => 100 
            [post_id] => 1 
            [parent_id] => 
            [comment] => dsdfsdfdg 
            [created_at] => 2014-02-17 09:06:08 
            [updated_at] => 2014-02-17 09:06:08 
           ) 

          [original:protected] => Array 
           (
            [id] => 27 
            [user_id] => 100 
            [post_id] => 1 
            [parent_id] => 
            [comment] => dsdfsdfdg 
            [created_at] => 2014-02-17 09:06:08 
            [updated_at] => 2014-02-17 09:06:08 
           ) 

          [relations:protected] => Array 
           (
           ) 

          [hidden:protected] => Array 
           (
           ) 

          [visible:protected] => Array 
           (
           ) 

          [appends:protected] => Array 
           (
           ) 

          [guarded:protected] => Array 
           (
            [0] => * 
           ) 

          [dates:protected] => Array 
           (
           ) 

          [touches:protected] => Array 
           (
           ) 

          [observables:protected] => Array 
           (
           ) 

          [with:protected] => Array 
           (
           ) 

          [exists] => 1 
          [softDelete:protected] => 
         ) 

        [20] => Comment Object 
         (
          [table:protected] => comments 
          [fillable:protected] => Array 
           (
            [0] => id 
           ) 

          [connection:protected] => 
          [primaryKey:protected] => id 
          [perPage:protected] => 15 
          [incrementing] => 1 
          [timestamps] => 1 
          [attributes:protected] => Array 
           (
            [id] => 28 
            [user_id] => 100 
            [post_id] => 1 
            [parent_id] => 
            [comment] => dsdfsdfdg 
            [created_at] => 2014-02-17 09:08:14 
            [updated_at] => 2014-02-17 09:08:14 
           ) 

          [original:protected] => Array 
           (
            [id] => 28 
            [user_id] => 100 
            [post_id] => 1 
            [parent_id] => 
            [comment] => dsdfsdfdg 
            [created_at] => 2014-02-17 09:08:14 
            [updated_at] => 2014-02-17 09:08:14 
           ) 

          [relations:protected] => Array 
           (
           ) 

          [hidden:protected] => Array 
           (
           ) 

          [visible:protected] => Array 
           (
           ) 

          [appends:protected] => Array 
           (
           ) 

          [guarded:protected] => Array 
           (
            [0] => * 
           ) 

          [dates:protected] => Array 
           (
           ) 

          [touches:protected] => Array 
           (
           ) 

          [observables:protected] => Array 
           (
           ) 

          [with:protected] => Array 
           (
           ) 

          [exists] => 1 
          [softDelete:protected] => 
         ) 

       ) 

      [5] => Array 
       (
        [0] => Comment Object 
         (
          [table:protected] => comments 
          [fillable:protected] => Array 
           (
            [0] => id 
           ) 

          [connection:protected] => 
          [primaryKey:protected] => id 
          [perPage:protected] => 15 
          [incrementing] => 1 
          [timestamps] => 1 
          [attributes:protected] => Array 
           (
            [id] => 7 
            [user_id] => 12 
            [post_id] => 1 
            [parent_id] => 5 
            [comment] => Consequatur aut consequuntur ut voluptatem et. 
            [created_at] => 2013-09-19 11:21:35 
            [updated_at] => 2013-09-19 11:21:35 
           ) 

          [original:protected] => Array 
           (
            [id] => 7 
            [user_id] => 12 
            [post_id] => 1 
            [parent_id] => 5 
            [comment] => Consequatur aut consequuntur ut voluptatem et. 
            [created_at] => 2013-09-19 11:21:35 
            [updated_at] => 2013-09-19 11:21:35 
           ) 

          [relations:protected] => Array 
           (
           ) 

          [hidden:protected] => Array 
           (
           ) 

          [visible:protected] => Array 
           (
           ) 

          [appends:protected] => Array 
           (
           ) 

          [guarded:protected] => Array 
           (
            [0] => * 
           ) 

          [dates:protected] => Array 
           (
           ) 

          [touches:protected] => Array 
           (
           ) 

          [observables:protected] => Array 
           (
           ) 

          [with:protected] => Array 
           (
           ) 

          [exists] => 1 
          [softDelete:protected] => 
         ) 

       ) 

       ) 

      [2] => Array 
       (
        [0] => Comment Object 
         (
          [table:protected] => comments 
          [fillable:protected] => Array 
           (
            [0] => id 
           ) 

          [connection:protected] => 
          [primaryKey:protected] => id 
          [perPage:protected] => 15 
          [incrementing] => 1 
          [timestamps] => 1 
          [attributes:protected] => Array 
           (
            [id] => 9 
            [user_id] => 74 
            [post_id] => 1 
            [parent_id] => 2 
            [comment] => Omnis est tenetur eum quo totam. 
            [created_at] => 2013-11-12 12:40:41 
            [updated_at] => 2013-11-12 12:40:41 
           ) 

          [original:protected] => Array 
           (
            [id] => 9 
            [user_id] => 74 
            [post_id] => 1 
            [parent_id] => 2 
            [comment] => Omnis est tenetur eum quo totam. 
            [created_at] => 2013-11-12 12:40:41 
            [updated_at] => 2013-11-12 12:40:41 
           ) 

          [relations:protected] => Array 
           (
           ) 

          [hidden:protected] => Array 
           (
           ) 

          [visible:protected] => Array 
           (
           ) 

          [appends:protected] => Array 
           (
           ) 

          [guarded:protected] => Array 
           (
            [0] => * 
           ) 

          [dates:protected] => Array 
           (
           ) 

          [touches:protected] => Array 
           (
           ) 

          [observables:protected] => Array 
           (
           ) 

          [with:protected] => Array 
           (
           ) 

          [exists] => 1 
          [softDelete:protected] => 
         ) 

       ) 

      [1] => Array 
       (
        [0] => Comment Object 
         (
          [table:protected] => comments 
          [fillable:protected] => Array 
           (
            [0] => id 
           ) 

          [connection:protected] => 
          [primaryKey:protected] => id 
          [perPage:protected] => 15 
          [incrementing] => 1 
          [timestamps] => 1 
          [attributes:protected] => Array 
           (
            [id] => 10 
            [user_id] => 66 
            [post_id] => 1 
            [parent_id] => 1 
            [comment] => Non consequatur excepturi molestias tempore voluptatem. 
            [created_at] => 2013-09-19 09:13:02 
            [updated_at] => 2013-09-19 09:13:02 
           ) 

          [original:protected] => Array 
           (
            [id] => 10 
            [user_id] => 66 
            [post_id] => 1 
            [parent_id] => 1 
            [comment] => Non consequatur excepturi molestias tempore voluptatem. 
            [created_at] => 2013-09-19 09:13:02 
            [updated_at] => 2013-09-19 09:13:02 
           ) 

          [relations:protected] => Array 
           (
           ) 

          [hidden:protected] => Array 
           (
           ) 

          [visible:protected] => Array 
           (
           ) 

          [appends:protected] => Array 
           (
           ) 

          [guarded:protected] => Array 
           (
            [0] => * 
           ) 

          [dates:protected] => Array 
           (
           ) 

          [touches:protected] => Array 
           (
           ) 

          [observables:protected] => Array 
           (
           ) 

          [with:protected] => Array 
           (
           ) 

          [exists] => 1 
          [softDelete:protected] => 
         ) 

       ) 

     ) 

) 

당신은 "-1"의 그룹을 볼 수있는 코멘트 .

답변

1

지금까지 컨트롤러에서 개인화 된 함수를 만들어 그룹화 된 주석 컬렉션 객체를 처리했습니다. 다음

private function commentToArrayAndSort(Illuminate\Database\Eloquent\Collection $groupedComments, Closure $sortClosure, Closure $childrenSortClosure = null) 
{ 
    $formattedComments = array(); 
    $keys = array_keys($groupedComments->toArray()); 
    for($i = 0; $i < count($keys); $i++) 
    { 
     $comments = $groupedComments[$keys[$i]]; 
     $formattedComments[$keys[$i]] = array(); 
     $counter = 0; 
     foreach($comments as $comment) 
     { 
      $commentArr = $comment->toArray(); 
      $commentObj = new Comment(array(
       "id" => $commentArr['id'], 
       "user_id" => $commentArr['user_id'], 
       "post_id" => $commentArr['post_id'], 
       "parent_id" => $commentArr['parent_id'], 
       "comment" => $commentArr['comment'], 
       "created_at" => $commentArr['created_at'], 
       "updated_at" => $commentArr['updated_at'], 
      )); 

      $commentObj->setRelations(array('author'=>new User($comment->toArray()['author']))); 
      array_push($formattedComments[$keys[$i]], $commentObj); 
      $counter++; 
     } 

     // Sort Array 
     if ($counter > 1) { 
      uasort($formattedComments[$keys[$i]], $sortClosure); 
     } 
    } 

    return $formattedComments; 
} 

그리고 다음과 같이 호출 :

이 같은 함수가 어떻게

$post->comments = $this->commentToArrayAndSort($groupedComments, function($a, $b){ 
     return $a->created_at->gte($b->created_at) ? -1 : 1; 
    }); 

이것에 대한 더 나은 솔루션이 있는지 모르겠어요. 지금까지 나는 이것을 얻었다. 사람이 내 대답을 개선하거나 더 나은 솔루션을 제공 할 수있는 경우, PLZ

0

:) 내가 관련된 무언가를 찾고 있었다

감사합니다 공유하고 나에게 도움을주고 그것을 게시 : 나는 조작해야 을 내 데이터를 컨트롤러에서 Eloquent에서보기에 전달하기 전에. 그래서 예를 들면 :

$events = App\Models\Event::->get(); 
$eventsDecade = []; 
    foreach ($events as $key => $value) { 
     $decade = substr(date('Y', strtotime($value->date)), 0, -1)."0"; 
     $eventsDecade[$decade][] = new App\Models\Event($value->toArray()); 
    } 

나는 정상적인 개체로 사용할 수있는 이벤트 객체 년대와 각 십 년간 안에 새로운 배열을 만드는거야 이렇게함으로써 : {{ $event->name }}를 예를 들어 foreach는에 있습니다. 귀하의 질문이 정확하다는 확신이 없음 ...