MapReduce在CakePHP 3.x中不起作用



我正在使用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

相关内容

  • 没有找到相关文章

最新更新