我刚刚转移到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')
答案 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)
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
干得好,再次感谢你。 :)