将 cakephp 2.x 迁移到 3.x 分组查询结果
Migration cakephp 2.x to 3.x grouped result from query
我用 cakephp2 编码了一段时间。我使用 table 计算每年和每月的值。
例如
YEAR | MONTH | VALUENAME | VALUE
2011 | 1 | value1 | 100
2011 | 2 | value1 | 120
2011 | 1 | value2 | 1234
2011 | 2 | value2 | 4342
etc.
现在我想要每个 'valuename' 的年度总和值。
在 Cake2 中,我使用以下表达式来获取结果,其中我将年份作为数组键(这对我的观点很重要):
$yearvalues = $this->Aggregation->find('list', [
"fields" => ['Aggregation.value_name', 'Aggregation.sum_value', 'Aggregation.y'],
"group" => ['Aggregation.y', 'Aggregation.value_name']
]);
在我的模型中 'Aggregation' 我得到以下信息:
public $virtualFields = array(
'sum_value' => "sum(value)",
);
结果如下:
Array
(
[2011] => Array
(
[value1] => 1429.00
[value2] => 1180.00
[value3] => 0.00
[value4] => 804.00
)
[2012] => Array
(
[value1] => 1878.00
[value2] => 2793.00
[value3] => 3900.00
[value4] => 1606.00
)
...
)
现在如何在 Cake3 中获得相同的结果。我对如何以正确的方式处理查询对象有点困惑:-(
这就是我现在得到的:
$yearvalues->select(['Aggregation.value_name',
'sum_value' => $yearvalues->func()->sum('Aggregation.value'), 'y'])
->group(['Aggregation.y', 'Aggregation.value_name']);
有人可以帮助我找到正确的方法吗?
谢谢
奥利弗
您也可以在 CakePHP 3.x 中使用 list
查找器,它支持类似的选项。
$yearvalues
->find('list', [
'keyField' => 'value_name',
'valueField' => 'sum_value',
'groupField' => 'y'
])
->select([
'Aggregation.value_name',
'sum_value' => $yearvalues->func()->sum('Aggregation.value'),
'Aggregation.y'
])
->group([
'Aggregation.y',
'Aggregation.value_name'
]);
list
查找器基本上只是添加了一个结果格式化程序,它将使用 Collection::combine()
来格式化检索到的结果,这也是为什么你不为字段选项使用别名的原因,在结果中只会是 entities/arrays 和 properties/field 名称索引!
另见
我用 cakephp2 编码了一段时间。我使用 table 计算每年和每月的值。 例如
YEAR | MONTH | VALUENAME | VALUE
2011 | 1 | value1 | 100
2011 | 2 | value1 | 120
2011 | 1 | value2 | 1234
2011 | 2 | value2 | 4342
etc.
现在我想要每个 'valuename' 的年度总和值。 在 Cake2 中,我使用以下表达式来获取结果,其中我将年份作为数组键(这对我的观点很重要):
$yearvalues = $this->Aggregation->find('list', [
"fields" => ['Aggregation.value_name', 'Aggregation.sum_value', 'Aggregation.y'],
"group" => ['Aggregation.y', 'Aggregation.value_name']
]);
在我的模型中 'Aggregation' 我得到以下信息:
public $virtualFields = array(
'sum_value' => "sum(value)",
);
结果如下:
Array
(
[2011] => Array
(
[value1] => 1429.00
[value2] => 1180.00
[value3] => 0.00
[value4] => 804.00
)
[2012] => Array
(
[value1] => 1878.00
[value2] => 2793.00
[value3] => 3900.00
[value4] => 1606.00
)
...
)
现在如何在 Cake3 中获得相同的结果。我对如何以正确的方式处理查询对象有点困惑:-( 这就是我现在得到的:
$yearvalues->select(['Aggregation.value_name',
'sum_value' => $yearvalues->func()->sum('Aggregation.value'), 'y'])
->group(['Aggregation.y', 'Aggregation.value_name']);
有人可以帮助我找到正确的方法吗?
谢谢 奥利弗
您也可以在 CakePHP 3.x 中使用 list
查找器,它支持类似的选项。
$yearvalues
->find('list', [
'keyField' => 'value_name',
'valueField' => 'sum_value',
'groupField' => 'y'
])
->select([
'Aggregation.value_name',
'sum_value' => $yearvalues->func()->sum('Aggregation.value'),
'Aggregation.y'
])
->group([
'Aggregation.y',
'Aggregation.value_name'
]);
list
查找器基本上只是添加了一个结果格式化程序,它将使用 Collection::combine()
来格式化检索到的结果,这也是为什么你不为字段选项使用别名的原因,在结果中只会是 entities/arrays 和 properties/field 名称索引!
另见