我正在使用CakePHP 3.x,我的应用程序有添加/编辑页面,在编辑操作中我正在使用此代码。
$patient = $this->Patients->get($patientId);
获取患者记录。
现在我想在查找操作后修改某个字段的值,假设我想将dob
字段 (date_of_birth) 转换为不同的日期格式,在 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 CakeDatasourceResultSetInterface|CakeCollectionCollectionInterface */
return $results->map(function($row) {
// note that now `dob` is a string!
$row['dob'] = $row['dob']->i18nFormat('dd. MMMM yyyy');
return $row;
});
})
->firstOrFail();
参见
- Cookbook> Database Access & ORM> Entities> Create Virtual Fields
- Cookbook> Database Access & ORM> Query Builder> Add Compute Fields
- API> \Cake\Datasource\QueryTrait::formatResults()
- API> \Cake\I18n\Time::i18nFormat