sql >> Base de Datos >  >> RDS >> Mysql

CakePHP 3.5 Aplicar siempre la función MySQL asText() al campo espacial

AFAIK no existe tal funcionalidad, las clases de tipo y el contenido de la cláusula de selección nunca se tocan.

Si quisiera aplicar esto a todos los hallazgos, podría, por ejemplo, usar Model.beforeFind() evento, atraviesa el select cláusula y transformar los campos en expresiones. Aquí hay un ejemplo rápido y sucio, donde field es el nombre del POLYGON tipo de columna:

// 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']
    );
}

Es posible que deba dar cuenta de $field como expresiones también, en caso de que el campo se pueda usar en uno y deba convertirse allí también.

Otra forma sería convertir los datos en el nivel de PHP en la clase de tipo 'toPHP() método, como ya se indicó en su ejemplo de código.

Véase también