AFAIK няма такава функционалност, съдържанието на класове тип и клауза за избор никога не се докосва.
Ако искате да приложите това към всички находки, можете например да използвате Model.beforeFind()
събитие, преминете през select
клауза и трансформирайте полетата в изрази. Ето бърз и мръсен пример, където field
е името на POLYGON
тип колона:
// in the respective table class
use Cake\Event\Event;
use Cake\ORM\Query;
// ...
public function beforeFind(Event $event, Query $query, \ArrayObject $options, $primary)
{
$query->traverse(
function (&$value) use ($query) {
if (empty($value)) {
$value = $query->aliasFields($this->getSchema()->columns());
}
foreach ($value as $key => $field) {
if (is_string($field) &&
$this->aliasField($field) === $this->aliasField('field')
) {
unset($value[$key]);
$value[key($query->aliasField($field))] = $query->func()->AsText([
$this->aliasField('field') => 'identifier'
]);
}
}
},
['select']
);
}
Може да се наложи да отчитате $field
като изрази също, в случай че полето може да се използва в един и трябва да бъде преобразувано и там.
Друг начин би бил да преобразувате данните на ниво PHP в класа на типа 'toPHP()
метод, както вече е посочено във вашия пример за код.
Вижте също
- Готварска книга> Достъп до база данни и ORM> Обекти на таблица> Обратни извиквания на жизнения цикъл> beforeFind
- API> \Cake\Database\ Query::traverse()