AFAIK il n'y a pas une telle fonctionnalité, les classes de type et le contenu de la clause select ne se touchent jamais.
Si vous vouliez appliquer cela à toutes les trouvailles, vous pourriez par exemple utiliser le Model.beforeFind()
événement, parcourez le select
clause et transformer les champs en expressions. Voici un exemple rapide et grossier, où field
est le nom du POLYGON
type de colonne :
// 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']
);
}
Vous devrez peut-être comptabiliser $field
en tant qu'expressions également, au cas où le champ pourrait être utilisé dans l'une d'entre elles et doit également y être converti.
Une autre façon serait de convertir les données au niveau PHP dans la classe de type toPHP()
méthode, comme déjà indiqué dans votre exemple de code.
Voir aussi
- Livre de recettes > Accès à la base de données et ORM > Objets de table> Rappels de cycle de vie> beforeFind
- API > \Cake\Database\ Query::traverse()