CakePHP 3.4组由foreach循环结果

时间:2017-05-17 14:54:13

标签: cakephp foreach grouping cakephp-3.0 query-builder

我正在努力推进分组记录。

这是一个以相同日期保存的小时集合,我想在视图/输出中对它们进行分组。

有什么建议吗?我尝试了很多不同的方法。以下是我从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 ..

2 个答案:

答案 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)
    {
        // ...
    } 
} 

另见