Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

CakePHP 3.5 Sempre aplique a função MySQL asText() ao campo Spatial


AFAIK não existe tal funcionalidade, classes de tipo e conteúdo de cláusulas de seleção nunca tocam.

Se você quiser aplicar isso a todas as descobertas, poderá, por exemplo, usar o Model.beforeFind() evento, percorra o select cláusula e transformar os campos em expressões. Aqui está um exemplo rápido e sujo, onde field é o nome do POLYGON coluna tipo:
// 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']
    );
}

Você pode ter que contabilizar $field como expressões também, caso o campo possa ser usado em um e precise ser convertido lá também.

Outra maneira seria converter os dados no nível do PHP na classe de tipo toPHP() método, como já indicado em seu exemplo de código.

Veja também