对集合数组进行排序
Sorting array of collections
我有一个存储 3 个合并集合的数组:
public function answer() {
$interview = Interview::find(1);
$videoQuestions = $interview->VideoQuestions()->get();
foreach ($videoQuestions as $vq) {
$vq->type = 'video';
}
$textQuestions = $interview->TextQuestions()->get();
foreach ($textQuestions as $tq) {
$tq->type = 'text';
}
$uploadQuestions = $interview->UploadQuestions()->get();
foreach ($uploadQuestions as $uq) {
$uq->type = 'upload';
}
$questions = collect($videoQuestions);
$questions = $questions->merge($textQuestions);
$questions = $questions->merge($uploadQuestions);
$questions->sortBy('order_position');
dd($questions);
}
->sortBy 不起作用,因为我认为它不适用于集合数组。
这是我拥有的:
但我真的只是希望它成为一个合并的集合,而不是集合中的一个数组。
每个 VideoQuestion
或 TextQuestion
都有一个 order_position
我想作为排序依据的字段。
感谢任何帮助!
首先要收集的是一个 class,其中包含一个元素数组,这些元素具有用于过滤排序的特殊方法,文档:
The Illuminate\Support\Collection class provides a fluent, convenient
wrapper for working with arrays of data.
sortBy 方法 returns 排序的集合(它不适用于它拥有的项目):
$collection = collect([
['name' => 'Desk', 'price' => 200],
['name' => 'Chair', 'price' => 100],
['name' => 'Bookcase', 'price' => 150],
]);
$sorted = $collection->sortBy('price');
$sorted->values()->all();
/*
[
['name' => 'Chair', 'price' => 100],
['name' => 'Bookcase', 'price' => 150],
['name' => 'Desk', 'price' => 200],
]
*/
所以你应该有这样的东西:
$questions = $questions->sortBy('order_position');
dd($questions);
这可能是一个替代方案:
$interview = Interview::find(1)->with(['VideoQuestions',
'TextQuestions',
'UploadQuestions',
'Questions' => function($query){
$query->orderBy('order_position', 'asc');
}])->get();
定义关系并制作一个 table 问题,其中包含一个 order_position,您可以对其进行排序,而不是每个 table。
我有一个存储 3 个合并集合的数组:
public function answer() {
$interview = Interview::find(1);
$videoQuestions = $interview->VideoQuestions()->get();
foreach ($videoQuestions as $vq) {
$vq->type = 'video';
}
$textQuestions = $interview->TextQuestions()->get();
foreach ($textQuestions as $tq) {
$tq->type = 'text';
}
$uploadQuestions = $interview->UploadQuestions()->get();
foreach ($uploadQuestions as $uq) {
$uq->type = 'upload';
}
$questions = collect($videoQuestions);
$questions = $questions->merge($textQuestions);
$questions = $questions->merge($uploadQuestions);
$questions->sortBy('order_position');
dd($questions);
}
->sortBy 不起作用,因为我认为它不适用于集合数组。
这是我拥有的:
但我真的只是希望它成为一个合并的集合,而不是集合中的一个数组。
每个 VideoQuestion
或 TextQuestion
都有一个 order_position
我想作为排序依据的字段。
感谢任何帮助!
首先要收集的是一个 class,其中包含一个元素数组,这些元素具有用于过滤排序的特殊方法,文档:
The Illuminate\Support\Collection class provides a fluent, convenient wrapper for working with arrays of data.
sortBy 方法 returns 排序的集合(它不适用于它拥有的项目):
$collection = collect([
['name' => 'Desk', 'price' => 200],
['name' => 'Chair', 'price' => 100],
['name' => 'Bookcase', 'price' => 150],
]);
$sorted = $collection->sortBy('price');
$sorted->values()->all();
/*
[
['name' => 'Chair', 'price' => 100],
['name' => 'Bookcase', 'price' => 150],
['name' => 'Desk', 'price' => 200],
]
*/
所以你应该有这样的东西:
$questions = $questions->sortBy('order_position');
dd($questions);
这可能是一个替代方案:
$interview = Interview::find(1)->with(['VideoQuestions',
'TextQuestions',
'UploadQuestions',
'Questions' => function($query){
$query->orderBy('order_position', 'asc');
}])->get();
定义关系并制作一个 table 问题,其中包含一个 order_position,您可以对其进行排序,而不是每个 table。