AFAIK nie ma takiej funkcjonalności, wpisz klasy i zawartość klauzuli select nigdy nie dotykają.
Jeśli chcesz zastosować to do wszystkich znalezisk, możesz na przykład użyć Model.beforeFind()
zdarzenia, przejdź przez select
klauzuli i przekształć pola w wyrażenia. Oto szybki i brudny przykład, gdzie field
to nazwa POLYGON
wpisz kolumnę:
// 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']
);
}
Być może będziesz musiał uwzględnić $field
również jako wyrażenia, na wypadek gdyby pole mogło być użyte w jednym i również tam musi zostać przekonwertowane.
Innym sposobem byłoby przekonwertowanie danych na poziomie PHP w klasie typu' toPHP()
metody, jak już wskazano w twoim przykładzie kodu.
Zobacz także
- Książka kucharska> Dostęp do bazy danych i ORM> Obiekty tabeli> Wywołania zwrotne cyklu życia> przed znalezieniem
- API> \Cake\Database\ Zapytanie::traverse()