【问题标题】:CakePHP 3.4 group by foreach loop the resultCakePHP 3.4 group by foreach 循环结果
【发布时间】:2017-05-17 14:54:13
【问题描述】:

我正在努力寻找分组记录。

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

有什么建议吗?我尝试了很多不同的方法。这是我从数据库中获取它们的方法。 (日期=在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>

我的问题是我不知道从控制器分组时如何正确循环记录。在控制器中使用“组”条件时我找不到它们。使用“组”时,我只得到每个日期的第一条记录。

:) 我猜他们在里面的某个地方,但我无法弄清楚这个。我对蛋糕 3.4 很陌生..

【问题讨论】:

  • 我发现对“find”返回的数据进行明智的“调试”可以极大地帮助我弄清楚如何循环/显示它。但后来我有一些复杂的模型:-)..

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


【解决方案1】:

获得分组日期后,您将获得与每个分组日期匹配的所有日期。

// 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);
    }
}

【讨论】:

  • 那么为什么要在 SQL 级别进行分组呢?如果您无论如何都检索所有数据,那没有多大意义。 OP 很可能只是在寻找分组 results.
  • 这很有意义,它解决了问题。第一个查询获取不同的数据,对于每个不同的数据,第二个查询获取与其匹配的所有数据并将其索引到一个数组中。
  • 好吧,我可以通过用死黄鼠狼填充洞来修复漏气的轮胎,这可能会奏效,但我认为你会同意这不是一个非常好的解决方案;)你在做什么是不必要的,因为它无论如何都会检索所有数据,并且可能会发出数百个额外的查询,而结果数据基本上与根本不按 SQL 级别进行分组时相同。只需要对结果集进行分组即可。
  • 我没有得到你,我想如果你能写一个答案。
  • 酷,我会看到的。
【解决方案2】:

这是预期的结果,因为这就是 SQL 分组的工作方式,每组得到一个值,结果中根本不会有其他值。

如果你只是想以分组的方式输出东西,那就不同了,因为你必须选择所有数据,然后你可以简单地在 PHP 级别对结果进行分组,例如使用集合/结果集方法 @ 987654323@:

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

另见

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    • 1970-01-01
    • 2014-12-05
    • 2015-05-30
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    相关资源
    最近更新 更多