2014-02-18 182 views
1

我在数据库查询后得到一个集合。然后我通过传递闭包回调对它进行分组。最后,我想要使用每个传递闭包回调来对数组进行排序的集合对这些分组数组进行排序。但不工作。也许这是保护,如何实现这一目标?集合中的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()); 
    } 

通过这样做,我创建与十年每十年内,我可以作为一个正常的对象使用一个事件对象的新数组:在例如一个foreach {{ $event->name }}。 不确定你的问题到底是...