sql >> Database >  >> RDS >> Mysql

CakePHP 3.5 Altijd asText() MySQL-functie toepassen op ruimtelijk veld

AFAIK er is geen dergelijke functionaliteit, typeklassen en selecteer de inhoud van de clausule raken nooit aan.

Als u dit op alle vondsten wilt toepassen, kunt u bijvoorbeeld de Model.beforeFind() gebruiken gebeurtenis, doorloopt u de select clausule en zet de velden om in expressies. Hier is een snel en vies voorbeeld, waar field is de naam van de POLYGON type kolom:

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

Mogelijk moet u rekening houden met $field ook als uitdrukkingen, voor het geval het veld in een veld gebruikt kan worden en daar ook moet worden geconverteerd.

Een andere manier is om de gegevens op PHP-niveau om te zetten in de typeklasse' toPHP() methode, zoals al aangegeven in uw codevoorbeeld.

Zie ook



  1. MySQL SELECT MIN voor altijd, maar keer alleen terug als TUSSEN datums

  2. Unieke beperking niet gemaakt in JPA

  3. Zoek of getal is opgenomen in een uitdrukking zoals:1-3,5,10-15,20

  4. Hoe u eenmalig 4 miljard records laadt van MySQL naar SQL Server