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

CakePHP 3.5 Anvend altid asText() MySQL-funktionen på det rumlige felt

AFAIK der er ingen sådan funktionalitet, skriv klasser og udvalgte klausuler rører aldrig.

Hvis du ville anvende dette på alle fund, så kunne du f.eks. bruge Model.beforeFind() hændelse, skal du krydse select klausul og transformer felterne til udtryk. Her er et hurtigt og beskidt eksempel, hvor field er navnet på POLYGON type kolonne:

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

Du skal muligvis tage højde for $field også som udtryk, hvis feltet kan bruges i et og også skal konverteres der.

En anden måde ville være at konvertere dataene på PHP-niveau i typeklassen' toPHP() metode, som allerede angivet i dit kodeeksempel.

Se også



  1. Hvad er den mest passende datatype til lagring af en IP-adresse i SQL server?

  2. MySQL Fulltext Boolean Mode-søgning giver for mange resultater

  3. MySQL fjerner hurtigt dubletter fra stor database

  4. SQLAlchemy bekræfter SSL-forbindelse