Я использую CakePHP 3.x, в моем приложении есть страницы добавления / редактирования, в действии редактирования я использую этот код.
$patient = $this->Patients->get($patientId);
чтобы получить запись пациента.
Теперь я хочу изменить значение некоторого поля после операции поиска, скажем, я хочу преобразовать dob
поле (date_of_birth) в другой формат даты, в CakePHP 2.x это возможно в afterFind
обратный вызов, но в CakePHP 3.x Вот в последнем абзаце говорится, что
Если вам нужно изменить результаты после их получения, вы должны использовать Изменение результатов с помощью карты / уменьшить функция для изменения результатов. Функции сокращения карты заменяют обратный вызов afterFind, который был в предыдущих версиях CakePHP.
Я также использовал MapReduce
но это не сработает для меня.
Карта / уменьшение является своего рода излишним для такой простой задачи, я бы предложил вместо этого использовать средство форматирования результатов, т.е. 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();
Смотрите также
Других решений пока нет …