MapReduce在CakePHP 3.x中不起作用

时间:2016-02-12 07:41:00

标签: php cakephp mapreduce cakephp-3.x

我正在使用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,但它不适合我。

1 个答案:

答案 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();

另见