2013-05-20 20 views
5

ho un problema durante il salvataggio dei dati spaziali in CakePHP con SaveAll(). Non voglio davvero scrivere la query manualmente (Handling spatial data in CakePHP) perché ci sono un certo numero di modelli che vengono salvati.Salvataggio dati spaziali in CakePHP

Inoltre ho letto questa CakePHP and MySQL Spatial Extension ma quando cerco di fare lo stesso, $db->expression() restituisce uno stdClass.

Questo è l'oggetto restituito stampato fuori:

stdClass Object 
(
    [type] => expression 
    [value] => GeomFromText('POINT(48.18879 18.527579999999944)') 
) 

Se io uso questo oggetto il modo in cui viene utilizzato in CakePHP and MySQL Spatial Extension e cercare di salvarlo con SaveAll() ottengo questo errore:

Errore: impossibile utilizzare oggetto di tipo stdClass come matrice
File: /www/s/t/u47728/public_html/lib/Cake/Model/Model.php
Line: 2221

Se uso la proprietà di valore, si arriva sfuggito nella query in modo che diventi solo una stringa. Allora ottengo questo errore:

Errore: SQLSTATE [22003]: il valore numerico non compreso nell'intervallo: 1416 Impossibile ottenere l'oggetto della geometria da dati inviati al campo GEOMETRIA

fa SaveAll() espressioni suport?

UPDATE

A quanto pare lo stesso vale per salvare function() e altri .... anche saveField()

risposta

6

convertito questa linea:

$this->data['Report']['position'] = $db->expression("GeomFromText('POINT(" . 
    $this->data['Report']['lat'] . " " . $this->data['Report']['lng'] . ")')"); 

a:

$this->data['Report']['position'] = (object) $db->expression("GeomFromText('POINT(" . 
    $this->data['Report']['lat'] . " " . $this->data['Report']['lng'] . ")')"); 

dovrebbe funzionare.

+1

ho provato il codice che avete inviato e non ha funzionato, tuttavia fusione di caratteri di un oggetto è stata la chiave così ho provato '$ this-> data [ 'Report'] [ 'posizione'] = (oggetto) $ DB-> espressione ("GeomFromText ('punto (". $ this-> data [ 'report'] [ 'lat']. "". $ this-> data [ 'report'] [ 'lng']. ")')"); e ha funzionato. Quindi contrassegnare la tua risposta come accettata in ogni caso perché mi porta alla soluzione. Grazie mille –

+0

modifica la mia risposta ... –

1

Si dovrebbe anche cambiare l'ordine dei tuoi dati.

Il modo giusto è: POINT (longitudine latitudine)

non poter commentare la risposta giusta, come non ho abbastanza reputazione.

Problemi correlati