在Laravel 5.3中收集groupBy之后如何使用sortBy?

时间:2017-01-28 05:37:05

标签: laravel laravel-5.3

我需要在使用Eloquent从sql获取查询后,在groupBy('date')中使用sortBy('price')创建collectLaravel 5.3

IndexController

$flights = Flights::GetFlights($fromCity, $toCity, $fromDate);

$collection = collect($flights);

$sortFlight = $collection->groupBy('date')->sortBy('price');

Model

public function scopeGetFlights($query, $fromCity, $toCity, $fromDate)
{
    // Between dates
    $beforeDate = date('Y-m-d', strtotime($fromDate . '- 10 days'));
    $afterDate = date('Y-m-d', strtotime($fromDate . '+ 10 days'));

    $join = $query
        -> join('airlines', 'airlines.pana', 'flights.airline')
        -> where('flights.from_city', $fromCity)
        -> where('flights.to_city', $toCity)
        -> whereBetween('flights.date', [$beforeDate, $afterDate])
        -> get([
                 'flights.*',
                 'airlines.pana as pana',
                 'airlines.name as airlineName'
              ]);
    return $join;
}

然后Print_r($sortFlight),打印后groupBy('date')有效  但sortBy('price')不起作用!!!!

我的问题在哪里?

3 个答案:

答案 0 :(得分:2)

来自doc

  

sortBy方法按给定键对集合进行排序。已排序的集合保留原始数组键,因此在此示例中,我们将使用values方法将键重置为连续编号的索引:

所以在完成groupBy()之后,请执行以下操作。

$sorted = $collection->sortBy('price');
$sorted->values()->all();

答案 1 :(得分:1)

试试这一行

$sortFlight = $collection->groupBy('date')->sortBy('price')->values()->all();

答案 2 :(得分:0)

我在Laravel中对分组集合中的值进行排序的解决方案

$sponsors = Sponsor::with('sponsor_level')->whereStatus(1)->get();

// grouped by sponsor level name
$grouped = $sponsors->sortBy('sponsor_level.order')->groupBy(function($item, $key){
    return $item->sponsor_level->name;
});

// finally sorted by sponsor name inside the group
return $grouped->map(function($item, $key){
    return $item->sortBy('name');
});

您当然可以将它们链接起来,为了更好的可读性,我分开了。