【问题标题】:Complex Laravel 5 group by on collection复杂的 Laravel 5 group by 集合
【发布时间】:2017-01-02 12:31:23
【问题描述】:

我有一个集合“事件”,它具有“站点”和“检查”的关系。

我想要做的是将“检查日期”的所有事件分组,然后在该组下按“站点”进行事件。

I.E

  • 检验日期 (YYYY-MM-DD)
    • 站点 1
      • 事件名称
      • 事件名称
    • 站点 2
      • 事件名称
  • 检验日期 (YYYY-MM-DD)
    • 站点 1
      • 事件名称

一旦我有了这个分组,我想输出一个像这样的数组:

[
  'title => 'Site Name: Event Name, Event Name, Event Name', 
  'date' => 'YYYY-MM-DD'
]

这远远超出了我的智商,因此我们将不胜感激!顺便说一句,我使用的是 Postgresql,所以看来我只能在 id 上使用 groupBy?

我尝试了一些使用 groupBy() 和 map() 的事情,这似乎让我有所了解,但不知道如何继续:

$events = $events->groupBy('inspection.id')->map(function($item){
    return $item->groupBy('site.id');
});

【问题讨论】:

    标签: php arrays laravel grouping


    【解决方案1】:

    假设结构(简化为数组):

    $events = [
       'name' => 'event name',
       'inspection' => ['date' => ' ... '] // relation
       'site' => ['name' => ' ... ']       // relation
    

    这是你需要的:

    $collection
       ->groupBy('inspection.date')
       ->map(function ($events, $date) { 
           return $events
              ->groupBy('site.name')
              ->map(function ($events, $site) use ($date) { 
                   return [
                      'title' => $site_name.': '.$events->implode('name', ', '), 
                      'date' => $date
                   ];
              }); 
       });
    

    【讨论】:

    • 感谢您的回复。我收到错误消息:array_key_exists(): The first argument should be either a string or an integerSomething to do with Postgresql?
    • 不,很可能您传递的密钥实际上是一个对象。粘贴代码
    • 这绝对是导致问题的日期,因为我可以在 ('inspection.name') 或 ('inspection.id') 之类的东西上使用 groupBy 但不能在 Inspection.date 上使用 - 无论如何我可以转换groupBy 闭包中的字符串的日期?
    • 感谢您为我指明了正确的方向,通过使用:->groupBy(function($events){ return $events->inspection->inspected_at->format('Y-m-d'); }) 设法让这个工作正常进行,现在我想做的是获得关于事件的另一个关系(EventType)并内爆$event->eventType->name to 'title' -对此有何想法?
    猜你喜欢
    • 2017-11-10
    • 2015-10-11
    • 1970-01-01
    • 2017-08-05
    • 2012-09-08
    • 2011-10-23
    • 1970-01-01
    • 2014-08-20
    • 1970-01-01
    相关资源
    最近更新 更多