MapReduce在CakePHP 3.x中不工作
我使用的是CakePHP3.x,我的应用程序有添加/编辑页面,在编辑操作中,我使用的是这段代码MapReduce在CakePHP 3.x中不工作,php,cakephp,mapreduce,cakephp-3.x,Php,Cakephp,Mapreduce,Cakephp 3.x,我使用的是CakePHP3.x,我的应用程序有添加/编辑页面,在编辑操作中,我使用的是这段代码 $patient = $this->Patients->get($patientId); 获取患者的病历 现在我想在find操作后修改一些字段的值,比如我想将dob字段(出生日期)转换成不同的日期格式,在CakePHP 2.x中,在afterFind回调中是可能的,但在CakePHP 3.x的最后一段中,它声明 如果在获取结果后需要修改结果,则应使用函数修改结果。map reduce功
$patient = $this->Patients->get($patientId);
获取患者的病历
现在我想在find操作后修改一些字段的值,比如我想将dob
字段(出生日期)转换成不同的日期格式,在CakePHP 2.x中,在afterFind
回调中是可能的,但在CakePHP 3.x的最后一段中,它声明
如果在获取结果后需要修改结果,则应使用函数修改结果。map reduce功能取代了CakePHP早期版本中的“afterFind”回调
我也曾使用过
MapReduce
,但它对我不起作用。Map/reduce对于这样一个简单的任务来说有点过火了,我建议改用结果格式化程序,即Query::formatResults()
为了使用其中任何一种,即映射器/还原器或格式化程序,必须使用Table::find()
而不是Table::get()
,因为后者不返回查询,而是返回结果,并且选项不支持映射器/还原器或格式化程序
但是,根据需要格式化值的位置,助手、虚拟字段或仅在必要时格式化可能是更好的选择
无论如何,这里有一个基本的例子:
$patient = $this->Patients
->find();
->where([
'id' => $patientId
])
->formatResults(function($results) {
/* @var $results \Cake\Datasource\ResultSetInterface|\Cake\Collection\CollectionInterface */
return $results->map(function($row) {
// note that now `dob` is a string!
$row['dob'] = $row['dob']->i18nFormat('dd. MMMM yyyy');
return $row;
});
})
->firstOrFail();
另见