MapReduce не работает в CakePHP 3.x

Я использую CakePHP 3.x, в моем приложении есть страницы добавления / редактирования, в действии редактирования я использую этот код.

 $patient = $this->Patients->get($patientId);

чтобы получить запись пациента.

Теперь я хочу изменить значение некоторого поля после операции поиска, скажем, я хочу преобразовать dob поле (date_of_birth) в другой формат даты, в CakePHP 2.x это возможно в afterFind обратный вызов, но в CakePHP 3.x Вот в последнем абзаце говорится, что

Если вам нужно изменить результаты после их получения, вы должны использовать Изменение результатов с помощью карты / уменьшить функция для изменения результатов. Функции сокращения карты заменяют обратный вызов afterFind, который был в предыдущих версиях CakePHP.

Я также использовал MapReduce но это не сработает для меня.

3

Решение

Карта / уменьшение является своего рода излишним для такой простой задачи, я бы предложил вместо этого использовать средство форматирования результатов, т.е. 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();

Смотрите также

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]