sql >> Databáze >  >> RDS >> Mysql

CakePHP 3.5 Vždy použijte funkci jakoText() MySQL na prostorové pole

AFAIK žádná taková funkce neexistuje, typové třídy a výběrové klauzule se nikdy nedotýkají.

Pokud byste to chtěli použít na všechny nálezy, můžete například použít Model.beforeFind() událost, projděte select klauzule a transformovat pole na výrazy. Zde je rychlý a špinavý příklad, kde field je název POLYGON sloupec typu:

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

Možná budete muset zaúčtovat $field také jako výrazy, pro případ, že by pole mohlo být použito v jednom a tam je také potřeba převést.

Dalším způsobem by bylo převést data na úrovni PHP v typové třídě' toPHP() jak již bylo uvedeno v příkladu kódu.

Viz také



  1. jak používat relace a pole v databázovém dotazu k ukládání a zobrazování dat

  2. postgresql generuje sekvenci bez mezery

  3. SQL 'LIKE BINARY' je pomalejší než prostý 'LIKE'?

  4. Jak mohu spustit uloženou proceduru bez dotazu v JDBC