CakePHP Group By和Sum on a Virtual Field?

时间:2014-08-07 15:38:09

标签: php sql cakephp

使用关联模型时,CakePHP的虚拟字段是有限的,我知道。然而。

我有一个系统,我希望每个项目花费数小时,然后是该项目的每个操作小时数。我有一个包含" Logs"这是人们进出项目时创建的。然后是一个名为与该表相关的项目的表。日志记录有一个名为" Operation"这决定了他们在工作中做了什么。

Cake的内置行为会过滤记录,因此它只显示当前项目的日志。我已经在飞行中做了一个""计算用户登录到项目的总分钟数的虚拟字段。这一切都正常。

我想知道的是,我可以在"分钟"虚拟字段,然后按操作分组。

这是我到目前为止所得到的:

$this->Project->ProjectLogs->virtualFields['minutes'] = 'TIMESTAMPDIFF(MINUTE, ProjectLogs.in, ProjectLogs.out)';
$prep = $this->Project->ProjectLogs->find('all');

这是正常的,我只需要对虚拟字段进行分组和总计'分钟'

你能用虚拟字段做到吗?

1 个答案:

答案 0 :(得分:1)

由于它是一个虚拟字段,因此您无法使用该虚拟字段(分钟)对数据求和(作为另一个虚拟字段)。您需要在sum函数中重新定义虚拟字段:

$this->Project->ProjectLogs->virtualFields['minutes'] = 'TIMESTAMPDIFF(MINUTE, ProjectLogs.in, ProjectLogs.out)';
$this->Project->ProjectLogs->virtualFields['sum_of_minutes'] = 'SUM(TIMESTAMPDIFF(MINUTE, ProjectLogs.in, ProjectLogs.out))';

然后,您可以对查询进行分组:

$prep = $this->Project->ProjectLogs->find('all', array(
    'group' => 'Operation'
));

这可能看起来很重复......好吧, 是重复的。由于您实际上是使用PHP构建SQL查询,因此可以使用PHP重用该VF定义来缩短重复因子:

$minutes = 'TIMESTAMPDIFF(MINUTE, ProjectLogs.in, ProjectLogs.out)';
// use $minutes now instead of duplicating
$this->Project->ProjectLogs->virtualFields['minutes'] = $minutes;
$this->Project->ProjectLogs->virtualFields['sum_of_minutes'] = 'SUM(' . $minutes . ')';
相关问题