Laravel 5 从数据库结果中形成另一个数组

Posted

技术标签:

【中文标题】Laravel 5 从数据库结果中形成另一个数组【英文标题】:Laravel 5 form another array from database result 【发布时间】:2016-01-11 00:48:21 【问题描述】:

我是 Laravel 的新手,我已经为此苦苦挣扎了太久,尝试搜索 SO 和 google 以获取信息,但无法解决此问题。

我正在创建博客,需要制作某种导航/存档来显示年份和月份以及每年和每个月份有多少博客帖子。通过点击那些年/月,我会在不同的视图上显示该时间段内的帖子。

我希望它们像这样显示在视图中:

2015 (10)
  January(3)
  February(3)
  March(3)
  April(1)
2014 (2)
  May(1)
  June(1)

等等。

我得到这样的数据库查询:

    $links = \DB::table('posts')
    ->select(\DB::raw('YEAR(created_at) year, MONTH(created_at) month, MONTHNAME(created_at) month_name, COUNT(*) id'))
    ->where('active',1)
    ->groupBy('year')
    ->groupBy('month')
    ->orderBy('year', 'desc')
    ->orderBy('month', 'desc')
    ->get();

这给了我这样的表格:

   array:3 [
      0 => #275
        +"year": "2015"
        +"month": "10"
        +"month_name": "October"
        +"id": "3"
      
      1 => #274
        +"year": "2015"
        +"month": "9"
        +"month_name": "September"
        +"id": "1"
      
      2 => #273
        +"year": "2014"
        +"month": "8"
        +"month_name": "August"
        +"id": "1"
      
    ]

我怎样才能像我描述的那样在我的视图上打印它? 如果我在这样的视图中遍历数组:

@foreach($links as $link)
    <h3 class="text-uppercase"><a href=" url('blog/'.$link->year) "> $link->year </a></h3>
    <p><small class="blog_date"><a href=" url('blog/'.$link->year.'/'.$link->month) "> $link->month_name  ( $link->id ) </a></small>
@endforeach

我尝试在我的控制器中使用 foreach-loop 从 DB-results 创建另一个数组,其中结构将是正确的形式,我可以使用 foreach 在视图上打印它,但无法让它工作。

我知道我已经接近解决方案,但我仍在学习。请有人告诉我这是最好的方法。

【问题讨论】:

【参考方案1】:

在你的刀片中试试这个:

<?php $first_loop = 0; ?>
@foreach($links as $link)
    @if($first_loop == 0)
        <?php 
        $first_loop = 1;
        $current_year = $link->year;
        ?>
        <h3 class="text-uppercase"><a href=" url('blog/'.$link->year) "> $link->year </a></h3>
        <p><small class="blog_date"><a href=" url('blog/'.$link->year.'/'.$link->month) "> $link->month_name  ( $link->id ) </a></small></p>
    @else
        @if($current_year == $link->year)
            <p><small class="blog_date"><a href=" url('blog/'.$link->year.'/'.$link->month) "> $link->month_name  ( $link->id ) </a></small></p>
            <?php
            $current_year = $link->year;
            ?>
        @else
            <h3 class="text-uppercase"><a href=" url('blog/'.$link->year) "> $link->year </a></h3>
            <p><small class="blog_date"><a href=" url('blog/'.$link->year.'/'.$link->month) "> $link->month_name  ( $link->id ) </a></small></p>
            <?php
            $current_year = $link->year;
            ?>
        @endif
    @endif
@endforeach

【讨论】:

这是我实际上首先尝试做的,但无法使其正常工作。解决方案在我看来有点难看,但它仍然有效。谢谢!【参考方案2】:

您可以在输出数据之前对其进行一些准备。例如:

$links = // .. your query;

$years = array_pluck($links, 'year');

$results = [];


foreach($years as $year)

   $posts_count = 0;
   $posts = array_where($links, function($key, $value) use ($year, $posts_count)
         if($value['year'] == $year)
         
            $posts_count += $value['id'];
            return true;
         

         return false;
   );

   $results[$year] = ['posts' => $posts, 'posts_count' => $posts_count];

您可以在某些存储库/服务类中执行上述操作,如果您愿意,甚至可以在控制器中执行上述操作(尽管不推荐)

然后在你看来,你可以有类似的东西:

@foreach($results as $year => $result)
   <a href=""> $year   data_get($result, 'posts_count') </a>
       <ul> 
            @foreach(data_get($result, 'posts') as $monthly_post)
               <li><a href=""> data_get($monthly_post, 'month_name')   data_get($monthly_post, 'id') </a></li>
            @endforeach
       </ul>
@endforeach

此代码未经测试,因此请将其用作您的方法的灵感,而不是复制粘贴解决方案。

【讨论】:

感谢您的回答,但无法让它工作,它说:“不能使用 stdClass 类型的对象作为数组”。我尝试使用 $value->year 和 $value->id 对其进行修改,但这给了我“调用非对象上的成员函数 count()”,我不知道它为什么这么说。你能解释一下为什么不建议在控制器中使用它吗? 控制器应该只是将数据传递给模型/服务类,然后将其发送到视图。控制器应该有几行代码,以便阅读代码的人可以快速了解发生了什么。如果您不坚持这一点,它们可能会变得混乱、难以阅读并且更难测试和维护。 好的,谢谢先生,这一切对我来说都很新鲜。那么最佳解决方案是创建新的提供者并将 $links 从控制器传递给它的一些方法?如果我的问题令人困惑,我很抱歉.. :) 是的,虽然提供者不一定是 Laravel 意义上的提供者,但它可以只是一个普通的类,你可以在其中进行预处理。关键是让你的控制器保持苗条,并在其他地方做实际的工作。题没问题,我们都在学习

以上是关于Laravel 5 从数据库结果中形成另一个数组的主要内容,如果未能解决你的问题,请参考以下文章

LARAVEL 5.8 - 在 foreach 中使用数组的 WHERE LIKE 子句的多个条件没有给出完整的结果

从可用数字中形成最大数字?

我如何传递从另一个模型获取的角色数组以在 laravel 中注册表单

LeetCode 2341. 数组能形成多少数对

LeetCode 2341. 数组能形成多少数对

如何使用数据库将数据从一个表导入另一个表:播种? (laravel 5.3)?