我正在努力推进分组记录。
这是一个以相同日期保存的小时集合,我想在视图/输出中对它们进行分组。
有什么建议吗?我尝试了很多不同的方法。以下是我从DB获取它们的方法。 (date = mysql中的类型日期“Y-m-d”)。输出正常。我所有的考验和错误......我可以整天写作,我相信这对于了解蛋糕库如何运作的人来说是一个简单的解决方案。
$hours = $this->UserHours->find('all', [
'conditions' => [
'UserHours.user_id' => $this->Auth->user('id'),
'month(UserHours.date)' => $this->request->data('date.month')
],
'order' => ['UserHours.date ASC'],
'group' => ['UserHours.date']
]);
foreach循环:
foreach ($projecthours as $hour):
debug($hour);
?>
<tr>
<td> <?php echo $hour->date;?> </td>
<td> <?php echo $hour->start; ?> </td>
<td> <?php echo $hour->end; ?> </td>
</tr>
我的问题是,我不知道如何从控制器分组时正确循环记录。在控制器中使用“组”条件时,我无法找到它们。使用“group”时,我只获得每个日期的第一条记录。
:)我猜他们在那里的某个地方,但我无法想象这一个。我很新蛋糕3.4 ..
答案 0 :(得分:0)
获得分组日期后,您将获得与每个分组日期匹配的所有日期。
// get grouped dates
$dates = $this->UserHours->find('all', [
'conditions' => [
'UserHours.user_id' => $this->Auth->user('id'),
'month(UserHours.date)' => $this->request->data('date.month')
],
'order' => ['UserHours.date ASC'],
'group' => ['UserHours.date']
]);
$hours = [];
// find all dates for each grouped date
foreach ($dates as $date) {
$hours[] = $this->UserHours->find('all', [
'conditions' => [
'UserHours.user_id' => $this->Auth->user('id'),
'month(UserHours.date)' => $this->request->data('date.month')
],
'order' => ['UserHours.date ASC']
])
->where(['UserHours.date' => $date->date]);
}
foreach ($hours as $values) {
foreach ($values as $hour) {
dd($hour->date);
}
}
答案 1 :(得分:0)
这是预期的结果,因为这就是SQL分组的工作方式,每组获得一个值,结果中根本就没有其他值。
如果您只想以分组的方式输出内容,那就是不同的东西,因为您必须选择所有数据,然后您可以简单地将结果分组到PHP级别,例如使用集合/ resultset方法groupBy()
:
$query = $this->UserHours->find('all', [
'conditions' => [
'UserHours.user_id' => $this->Auth->user('id'),
'month(UserHours.date)' => $this->request->data('date.month')
],
'order' => ['UserHours.date ASC']
]);
// callback usage required as `date` is most likely an object
$groupedByDate = $query->all()->groupBy(function ($row) {
return $row['date']->format('Y-m-d');
});
// if it weren't an object, then passing the fields name would already do it
// $groupedByDate = $query->all()->groupBy('date');
foreach ($groupedByDate as $date => $group)
{
// $date = the value of UserHours.date shared by all entities in the group
// $group = an array of UserHour entities that share the same UserHours.date value
foreach ($group as $hour)
{
// ...
}
}
另见