Mysql
 sql >> Database >  >> RDS >> Mysql

CakePHP 3.5 Applica sempre la funzione MySQL asText() al campo spaziale

AFAIK non esiste tale funzionalità, digitare classi e selezionare i contenuti della clausola non si toccano mai.

Se desideri applicarlo a tutti i risultati, puoi ad esempio utilizzare Model.beforeFind() evento, attraversa il select clausola e trasformare i campi in espressioni. Ecco un esempio veloce e sporco, dove field è il nome del POLYGON tipo colonna:

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

Potrebbe essere necessario tenere conto di $field anche come espressioni, nel caso in cui il campo possa essere utilizzato in uno e debba essere convertito anche lì.

Un altro modo sarebbe convertire i dati a livello PHP nella classe di tipo toPHP() metodo, come già indicato nel tuo esempio di codice.

Vedi anche