Laravel显示按年或月分组的记录详细信息

时间:2015-04-27 23:09:59

标签: sql laravel group-by

我刚刚转移到laravel框架并开始迁移一些遗留站点,我遇到了SQL或刀片的问题 - dunno。

我必须显示大量的行'体育课程'按年份和月份分组。每个人都需要出席考勤等。

我不确定采用哪种方式。 我能够显示所有行并按日期排序 - 轻松挤压 我能够将年份和月份分组 - 繁琐但对其进行排序。 这些都以手风琴形式显示。 点击月份 - 单个行下拉 - 您明白了

我每月/每年可以获得多行 我无法弄清楚的是如何实际显示行。

groupBy就是这样:

$LinkClasses = DB::table('classes_lists')
->select('id, class, teacher, size')
->select(DB::raw('YEAR(date) AS year, MONTH(date) AS month, MONTHNAME(date) AS month_name, COUNT(*) post_count'))
    ->groupBy('year')
    ->groupBy('month')
    ->orderBy('year', 'desc')
    ->orderBy('month', 'desc')
    ->orderBy('id', 'desc')

2 个答案:

答案 0 :(得分:0)

如果您提供的代码位于您的控制器中,则可以在上一个->get()之后附加->orderBy()。这将返回一个Collection。然后,您可以使用集合(http://laravel.com/api/master/Illuminate/Support/Collection.html)执行任何操作,包括使用->toArray()转换为数组,但我认为最好在可能的情况下使用Eloquent ORM。

无论如何,一旦你以你想要的格式获得它,只需将它传递给视图,如下所示:

return view('your.view', compact('LinkClasses'));

然后,在your.view刀片模板中,您可以使用以下方法访问它:

@foreach ($LinkClasses as $currentRow)
  <tr>
    <td>{{ $currentRow['id'] }}</td>
    <td>{{ $currentRow['class'] }}</td>
    <td> ... </td>
  </tr>
@endforeach

最好的猜测我可以提供,而无需看到刀片模板,以更好地了解您正在做的事情。希望有所帮助!

基于OP反馈的更新:

由于您只收到一条记录,因此问题似乎在于您的查询。我建议你简化查询以获取所有记录,然后在数组中进行排序。在您的控制器中有这样的东西:

$allClasses = DB::table('classes_lists')->all();
foreach ($allClasses as $currentClass) {
    $yearMonth = date('Y-m', $currentClass['date']);
    $classesByYearMonth[$yearMonth][] = $currentClass;
}
ksort($classesByYearMonth);

/* now you have an array of all classes sorted by year-month like this:
// $classesByYearMonth[2014-01] = array(
//     [0] => array(1, 'class name', 'teacher name', 23),
//     [1] => array(2, 'another class', 'different teacher', 25),
//     ...
// );
//
// $classesByYearMonth[2014-02] = ...
*/

return view('your.view', compact('classesByYearMonth'));

然后,在您的刀片模板中:

@foreach ($classesByYearMonth as $yearMonth => $classListArray)
    Found {{ sizeof($classListArray) }} classes for {{ $yearMonth }}
    @foreach ($classListArray as $currentClass)
        <div>
            <div>ID: {{ $currentClass['id'] }}</div>
            <div>Class: {{ $currentClass['class'] }}</div>
            <div>Teacher: {{ $currentClass['teacher'] }}</div>
            <div>Size: {{ $currentClass['size'] }}</div>
        </div>
    @endforeach
@endforeach

我会留给你修改格式以使你的手风琴工作。但希望这会让你走上正确的道路。

答案 1 :(得分:0)

DNoe - 非常感谢你。 你的回复让我走上了正确的轨道。 由于laravel歧义,我不得不修改一些位并添加strtotime但逻辑就在那里。

foreach ($allClasses as $currentClass) {
$ym = $currentClass['date']; 
$yearMonth = date("Y-m",strtotime($ym));
    $classesByYearMonth[$yearMonth][] = $currentClass;
}
krsort($classesByYearMonth);

return View::make('classes.index', compact('classesByYearMonth'));

从这里开始,CSS很简单。 我欠你一些啤酒。谢谢你帮助我从我的屁股中取出头来!

发送给我一个下午,我将非常乐意转发啤酒捐款:o

干得好,再次感谢你。 :)