Mysql
 sql >> Base de données >  >> RDS >> Mysql

CakePHP 3.5 Toujours appliquer la fonction MySQL asText() au champ Spatial

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