Laravel 对集合中的组数组进行排序
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/21844124/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Laravel sort group array in collection
提问by tjfdfs
I get a collection after database query. And then I group it by passing a closure callback. And then last, I want to sort these grouped array in collection using each which pass a closure callback to sort array. But NOT working. Maybe it's protected, how to achieve this?
我在数据库查询后得到一个集合。然后我通过传递闭包回调对其进行分组。然后最后,我想使用每个通过闭包回调对数组进行排序的集合中对这些分组数组进行排序。但不工作。也许它是受保护的,如何实现这一目标?
My code at PostController
我在 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);
Info of $post->comments
$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] =>
)
)
)
)
You can see that group of "-1" is not order by creation date.
您可以看到“-1”组不是按创建日期排序的。
回答by tjfdfs
So far, I achieve this by create a private function in controller to process grouped comment collection object.
到目前为止,我通过在控制器中创建一个私有函数来处理分组评论集合对象来实现这一点。
This is how the function like:
这是函数的样子:
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;
}
And then call it like this:
然后像这样调用它:
$post->comments = $this->commentToArrayAndSort($groupedComments, function($a, $b){
return $a->created_at->gte($b->created_at) ? -1 : 1;
});
I don't know if there's a better solution for this. So far I got this. If anyone can improve my answer or has a better solution, plz post it to share and give me a help
不知道有没有更好的解决办法。到目前为止我得到了这个。 如果有人可以改进我的答案或有更好的解决方案,请发布以分享并帮助我
Thanks :)
谢谢 :)
回答by Hugo Gresse
I was searching for something related : I have to manipulate my data from Eloquent in the controller before passing it to the view. So for example :
我正在寻找相关的东西:在将数据传递给视图之前,我必须在控制器中操作来自 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());
}
By doing this I'm creating a new array with the decade and inside each decade an Event Object that i can use as a normal object : {{ $event->name }}
in a foreach for example.
Not sure your question was exactly that...
通过这样做,我正在创建一个包含十年的新数组,并在每个十年内创建一个我可以用作普通对象的事件对象:{{ $event->name }}
例如在 foreach 中。不确定你的问题正是那个......