Mysql
 sql >> Datenbank >  >> RDS >> Mysql

CakePHP 3.5 Wenden Sie die MySQL-Funktion asText() immer auf das Spatial-Feld an

AFAIK gibt es keine solche Funktionalität, Typklassen und ausgewählte Klauselinhalte berühren sich nie.

Wenn Sie dies auf alle Funde anwenden möchten, können Sie beispielsweise Model.beforeFind() verwenden Ereignis, durchlaufen Sie das select -Klausel und wandeln die Felder in Ausdrücke um. Hier ist ein schnelles und schmutziges Beispiel, bei dem field ist der Name des POLYGON Geben Sie Spalte ein:

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

Möglicherweise müssen Sie $field berücksichtigen auch als Ausdrücke, falls das Feld eventuell in einem verwendet wird und dort auch konvertiert werden muss.

Eine andere Möglichkeit wäre, die Daten auf PHP-Ebene in der Typklasse toPHP() zu konvertieren Methode, wie bereits in Ihrem Codebeispiel angegeben.

Siehe auch