2017-10-06 3 views
1

Ich erstelle eine Tabelle wie folgt behandeln:Wie mySql POINT Felder in Laravel

/** 
* Run the migrations. 
* 
* @return void 
*/ 
public function up() 
{ 

    Schema::create('places', function (Blueprint $table) { 
     $table->engine = 'MyISAM'; 

     $table->increments('id'); 
     $table->text('description'); 

     $table->longText('address'); 
     $table->point('coordinates'); 
     $table->timestamps(); 
    }); 
} 

Ich habe ein Feld direkt in meine Datenbank mit:

INSERT INTO `places` (`id`, `description`, `address`, `coordinates`, `created_at`, `updated_at`) 
VALUES 
    (1, 'Plaza Condesa', 'Av. Juan Escutia 4, Hipodromo Condesa, Hipódromo, 06140 Cuauhtémoc, CDMX', X'000000000101000000965B5A0D89693340CC1B711214CB58C0', NULL, NULL); 

Dann rufe ich es in Laravel mit :

MyModel::first() 

Alle Werte scheinen korrekt mit Ausnahme der coordinates Feld zu sein, wo ich so etwas wie dieses:

�[Z 
�[email protected]�q�X� 

Wie kann ich die POINT Feld mit Laravel bekommen?

+0

habe ich nicht. Ich speicherte es direkt in mySQL – awavi

+0

Das ist der Punkt – awavi

+0

Ich habe es als SQL-Anweisung exportiert, aber es ist der Punkt (19.xxx -99.xxx) – awavi

Antwort

1

Sie haben im Moment nur die Daten in Ihrer Datenbank. Schema::create hat gerade die Tabelle in Ihrer Datenbank erstellt und dann eine reine SQL-Anweisung insert.

Sie nicht einen String oder ein Integer speichern haben, verwendet man die Zeigerdatentyp
https://dev.mysql.com/doc/refman/5.7/en/gis-class-point.html

Next verwendet, um Sie Laravel Eloquent diese Daten zu erhalten, sondern aus der Eloquent Sicht bekam man etwas Binary Daten, und wenn Sie es aussprechen, sieht es aus wie Sie gepostet haben.

Was Sie brauchen, ist eine Logik in Ihrer Modellklasse, die das Binärformat in das gewünschte Format übersetzt.

Dies ist ein adaptiertes Beispiel auf Ihre Situation, bildet den im folgenden Beitrag, den das Ergebnis AsText aus dem DB lädt: Laravel model with POINT/POLYGON etc. using DB::raw expressions

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 
use Illuminate\Support\Facades\DB; 

class Places extends Model 
{ 
    protected $geometry = ['coordinates']; 

    /** 
    * Select geometrical attributes as text from database. 
    * 
    * @var bool 
    */ 
    protected $geometryAsText = true; 

    /** 
    * Get a new query builder for the model's table. 
    * Manipulate in case we need to convert geometrical fields to text. 
    * 
    * @param bool $excludeDeleted 
    * 
    * @return \Illuminate\Database\Eloquent\Builder 
    */ 
    public function newQuery($excludeDeleted = true) 
    { 
     if (!empty($this->geometry) && $this->geometryAsText === true) 
     { 
      $raw = ''; 
      foreach ($this->geometry as $column) 
      { 
       $raw .= 'AsText(`' . $this->table . '`.`' . $column . '`) as `' . $column . '`, '; 
      } 
      $raw = substr($raw, 0, -2); 

      return parent::newQuery($excludeDeleted)->addSelect('*', DB::raw($raw)); 
     } 

     return parent::newQuery($excludeDeleted); 
    } 
} 

Jetzt können Sie zum Beispiel tun echo Places::first()->coordinates und das Ergebnis wird etwa POINT(19.4122475 -99.1731001) sein.

Je nachdem, was Sie zu tun haben, können Sie sich auch Eloquent Events ansehen. https://laravel.com/docs/5.5/eloquent#events Hier können Sie genauer einhaken, um die Dinge so zu ändern, wie Sie sie brauchen.