【问题标题】:Laravel Eloquent Array LoopLaravel Eloquent 数组循环
【发布时间】:2014-11-23 19:18:02
【问题描述】:

我有一个雄辩的查询,它返回一个“show”,以及与之相关的任何“show_ref”:

Show::where('show_slug','=',$id)->with('showrefs')->firstOrFail();

这样就成功带回了一个嵌套数组,如下:

{
   "show_id":2,
   "show_name":"ShowNo1",
   "show_logo":null,
   "show_facebook_url":null,
   "show_twitter_url":null,
   "show_website_url":null,
   "show_slug":"shown1",
   "created_at":"2014-09-27 11:57:32",
   "updated_at":"2014-09-27 11:57:32",
   "showrefs":[
      {
         "show_ref":1,
         "show_id":2,
         "show_start_date":"2014-05-16",
         "show_end_date":"2014-05-21",
         "show_year":2014,
         "show_common_name":"Mid May",
         "venue_id":null,
         "created_at":"2014-09-27 12:17:40",
         "updated_at":"2014-09-28 06:26:54"
      },
      {
         "show_ref":2,
         "show_id":2,
         "show_start_date":"2014-05-23",
         "show_end_date":"2014-05-28",
         "show_year":2014,
         "show_common_name":"Late May",
         "venue_id":null,
         "created_at":"2014-09-27 12:21:24",
         "updated_at":"2014-09-28 06:26:58"
      },
      {
         "show_ref":4,
         "show_id":2,
         "show_start_date":"2013-02-12",
         "show_end_date":"2013-02-13",
         "show_year":2013,
         "show_common_name":"Early February",
         "venue_id":null,
         "created_at":"2014-09-28 17:50:02",
         "updated_at":"2014-09-28 17:50:02"
      },
      {
         "show_ref":5,
         "show_id":2,
         "show_start_date":"2013-04-27",
         "show_end_date":"2013-04-28",
         "show_year":2013,
         "show_common_name":"Late April",
         "venue_id":null,
         "created_at":"2014-09-28 17:50:42",
         "updated_at":"2014-09-28 17:50:42"
      }
   ]
}

我想从我的观点中得到以下格式:

ShowNo1(节目名称)

2014

2014 年所有演出列表

2013

2013 年所有演出列表

到目前为止,我编写的代码有可能吗?还是我走错了路?

谢谢。

【问题讨论】:

    标签: php arrays laravel collections eloquent


    【解决方案1】:

    在不了解 Eloquent 的情况下,您可以使用一个简单的函数遍历嵌套数组并收集给定年份的节目:

    function collect_shows_with_year($shows, $year)
    {
      $result = array();
      foreach($shows["showrefs"] as $show_ref)
      {
        if($show_ref["show_year"] == $year)
        {
          $result[] = $show_ref;
        }
      }
      return $result;
    }
    
    $shows_in_2014 = collect_shows_with_year($shows, 2014);
    $shows_in_2013 = collect_shows_with_year($shows, 2013);
    

    【讨论】:

      【解决方案2】:

      您的Show 模型中有一个showrefs 函数定义了这种关系。 @Armon 的答案将起作用,但将按 O(n * years) 的顺序运行,其中 years 是您要显示的年数。您的示例只有 2 个,但可能更多,您可以改为在 O(n) 时间显示数据。

      您可以在定义关系的方法中orderBy。:

      // app/models/Show.php
      public function showrefs()
      {
          return $this->hasMany('ShowRef')->orderBy('show_start_date', 'DESC');
      }
      

      如果您要连接的表都包含您要排序的列,您可能需要通过附加表名来限定顺序,如下所示:

      ->orderBy('`show_refs`.`show_start_date`', 'DESC')
      

      之后,只需跟踪当前年份并在循环数据时注意它何时发生变化:

      $show = Show::where('show_slug','=',$id)->with('showrefs')->firstOrFail();
      $currentYear = '';
      foreach($show->showrefs as $showref) {
          $showRefYear = strtok($showref->show_start_date, '-');
          if($currentYear != $showRefYear) {
              $currentYear = $showRefYear;
              // Output Year heading
          }
      
          // Output show details
      }
      

      【讨论】:

      • 感谢@watcher,完全有道理。 foreach 会发生在控制器还是视图中?
      • 您很可能会将$show 或其showrefs 传递到视图并在那里执行@foreach。如果您在控制器中执行此操作,您最终将不得不在视图中再次循环显示它们,因此执行两次没有多大意义。
      • 我对它进行了调整,以便那些在我之后来到这里的人。在 IF 循环中检查 $currentYear$ShowRefYear 中的那些,我设置 currentYear:$currentYear = $showRefYear
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-20
      • 2018-03-20
      • 2017-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-30
      相关资源
      最近更新 更多