Php 如何按日期对查询进行排序和分组,并在Laravel中将其分组到数组中

Php 如何按日期对查询进行排序和分组,并在Laravel中将其分组到数组中,php,mysql,arrays,laravel,eloquent,Php,Mysql,Arrays,Laravel,Eloquent,我希望我的数据按日期分组并排序。然后我想让它在一个数组中传递,看起来是这样的: 这是我的疑问: $events = Event::with('specifications', 'users', 'location') ->join('locations','location_id', '=', 'events.location_id') ->where('locations.zip', '

我希望我的数据按日期分组并排序。然后我想让它在一个数组中传递,看起来是这样的:

这是我的疑问:

$events = Event::with('specifications', 'users', 'location')
                        ->join('locations','location_id', '=', 'events.location_id')
                        ->where('locations.zip', '=', $data['location'])
                        ->where('date', '>=', $data['date'])
                        ->orderBy('date')
                        ->get();
它给了我一个如下的数组:

[0] => Event Object
            (
                [...]
                [attributes:protected] => Array
                    (
                        [id] => 1
                        [title] => yyy
                        [image] => img/event/default.jpg
                        [desc] => Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing eli
                    )
                 [....]
              )
[1] => Event Object
                (
                    [...]
                    [attributes:protected] => Array
                        (
                            [id] => 2
                            [title] => xxx
                            [image] => img/event/default.jpg
                            [desc] => Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing eli
                        )
                     [....]
                  )
但是我想要一个像这样分类和分组的数组(你知道我的意思;):

这样我可以在两个循环中遍历数组。一个表示日期,一个表示对象。比如这个坏例子:

foreach($event_by_date as $evendate){
    <h2>$eventdate</h2>
    foreach($eventdate as $event){
        $event->name
        $event->desc
        ... etc ...
    }
}
foreach($event\u by\u date作为$evendate){
$eventdate
foreach($eventdate作为$event){
$event->name
$event->desc
等
}
}
我是如何用拉威尔和雄辩的提问做到这一点的?
我不是laravel/php忍者;)

我会手动操作,就像这样

$sortedArray =
    array_reduce(
         $events,
         function ($result, $element)
         {
              $result[$element->date][] = $element;
              return $result;
         }
    );
无需在此处排序,因为您的
$events
已按日期排序

此外,您的代码无论如何都不起作用,但使用我的代码,您可以:

foreach ($event_by_date as $date => $events) {
    <h2>$date</h2>
    foreach ($events as $event) {
        $event->name
        $event->desc
        ... etc ...
    }
}
foreach($event\u by\u date as$date=>$events){
$date
foreach($events作为$event){
$event->name
$event->desc
等
}
}

我的解决方案。如果你想做得更聪明,请告诉我:

    $data = Input::all();

    $data['date'] = date("Y-m-d", strtotime($data['date']));

    $events = Event::with('specifications', 'users', 'location')
                    ->join('locations','location_id', '=', 'events.location_id')
                    ->where('locations.zip', '=', $data['location'])
                    ->where('date', '>=', $data['date'])
                    ->orderBy('date')
                    ->get();

    $events_by_date = array();
    $increment = 0;
    foreach($events as $event){
        $formatted_date = substr($event->date, 0, 10);

        if(!isset($temp_date)){
            $temp_date = $formatted_date;
        } else {
            if($temp_date != $formatted_date){
                $increment++;
                $temp_date = $formatted_date;
            }               
        }

        $events_by_date[$increment]['date'] = $formatted_date;
        $events_by_date[$increment]['events'][] = $event;
    }

    return View::make('event.overview')->with('events_by_date', $events_by_date);

你的问题不清楚你想实现什么,我猜你想1。选择所有活动并按日期或您想要的时间顺序排列。选择所有事件并按日期分组哪一个?我想按日期分组和排序..好的,我解决了。谢谢我稍后会发布我的解决方案-谢谢!
    $data = Input::all();

    $data['date'] = date("Y-m-d", strtotime($data['date']));

    $events = Event::with('specifications', 'users', 'location')
                    ->join('locations','location_id', '=', 'events.location_id')
                    ->where('locations.zip', '=', $data['location'])
                    ->where('date', '>=', $data['date'])
                    ->orderBy('date')
                    ->get();

    $events_by_date = array();
    $increment = 0;
    foreach($events as $event){
        $formatted_date = substr($event->date, 0, 10);

        if(!isset($temp_date)){
            $temp_date = $formatted_date;
        } else {
            if($temp_date != $formatted_date){
                $increment++;
                $temp_date = $formatted_date;
            }               
        }

        $events_by_date[$increment]['date'] = $formatted_date;
        $events_by_date[$increment]['events'][] = $event;
    }

    return View::make('event.overview')->with('events_by_date', $events_by_date);