对集合数组进行排序

时间:2017-11-21 22:59:16

标签: laravel laravel-5.5

我有一个存储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无效,因为我认为它不适用于集合数组。

这就是我所拥有的: enter image description here

但我真的只是希望它是一个合并的集合而不是集合中的数组。

每个VideoQuestionTextQuestion都有order_position字段,我想按其排序。

感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

第一件事是一个包含元素数组的类,其中包含用于过滤排序的特殊方法,docs:

  

Illuminate \ Support \ Collection类提供了流畅,方便的功能   用于处理数据数组的包装器。

sortBy方法返回一个已排序的集合(它不适用于它拥有的项目):

$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);

答案 1 :(得分:0)

这可能是另一种选择:

$interview = Interview::find(1)->with(['VideoQuestions',
                                       'TextQuestions', 
                                       'UploadQuestions', 
                                       'Questions' => function($query){
                                           $query->orderBy('order_position', 'asc');
                                       }])->get();

定义关系并创建一个表包含可以排序的order_position而不是每个表的问题。