我正在使用CakePHP 3.x,我的应用程序添加/编辑页面,在编辑操作中我使用此代码。
$patient = $this->Patients->get($patientId);
获取病人记录。
现在我想在查找操作后修改某些字段的值,假设我想将dob
字段(date_of_birth)转换为不同的日期格式,在CakePHP 2.x中它可以在{{{} 1}}回调,但在最后一段中的CakePHP 3.x here中声明了,
如果您需要在获取结果后修改结果,则应使用Modifying Results with Map/Reduce函数修改结果。 map reduce功能取代了先前版本的CakePHP中的'afterFind'回调。
我还使用afterFind
,但它不适合我。
答案 0 :(得分:2)
Map / reduce对于这么简单的任务来说有点过分,我建议使用结果格式化程序,即Query::formatResults()
。
为了使用其中任何一个,即mapper / reducer或formatter,您必须使用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();
另见