Переопределение Laravel Model View - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь обработать маркеры на карте как можно более естественным образом, используя пространственные типы данных MySQL.Я не хочу прибегать к дополнительным столбцам для lat и lng,, так как со временем я хочу иметь возможность кодировать линии и многоугольники (и другие геометрии).Таблица имеет тип столбца point:

Schema::create('maps', function (Blueprint $table) {
    $table->increments('id');
    $table->point('map_center')->nullable();
    $table->timestamps();
});

Со стороны Eloquent выглядит немного глупее, чем я себе представлял, учитывая встроенную поддержку создания этих пространственных типов в базе данных.,Если я get() модель, map_center отображает необработанную закодированную геометрию.

>>> $map=Map::first()
=> App\Map {#2935
     id: 1,
     map_center: b"\0\0\0\0\x01\x01\0\0\0ºõš\x1E\x14\x7FRÀb0\x7F…Ì_D@",
     created_at: null,
     updated_at: null,
   }

Я написал метод center(), который возвращает объект, содержащий символы lat и long:

public function center()
{
    if ($this->map_center) 
    {
        $result = DB::select('
            select ST_Y(map_center) as lat, ST_X(map_center) as lng 
            from maps 
            where id = :id
        ', 
        ['id' => $this->id]);
        $center['lat'] = $result[0]->lat;
        $center['lng'] = $result[0]->lng;
        return (object) $center;
    }
    else
    {
        dd($this);
    }
} 

Вывод:

>>> $map->center()->lat
=> 40.748429

Это достойный обходной путь, но немного некрасиво.Вместо этого я хочу, чтобы Eloquent извлек это, чтобы модель возвращала читаемую человеком координату, что-то вроде:

>>> $map=Map::first()
=> App\Map {#2935
     id: 1,
     map_center: {
       lat: 40.748429,   // or X: and Y:
       lng: -73.985603, 
     }
     created_at: null,
     updated_at: null,
   }

Учитывая, что это тип point (с двумя компонентами), возможно ли автоматически получитьданные, использующие ST_AsText(p) или объект, содержащий ST_X(p) и ST_Y(p)?

Возможно ли это?

1 Ответ

0 голосов
/ 23 января 2019

MySQL сохраняет данные в формате WKB (хорошо известный двоичный файл).

Посмотрите здесь Преобразование бинарных полей GEOMETRY в MySQL в PHP

Вы можете использовать Атрибут модели . Это должно быть что-то вроде этого.

public function getMapCenterAttribute()
{
    $center = unpack('Lpadding/corder/Lgtype/dlatitude/dlongitude', $this->map_center);
    return $center;
}

У вас также должно быть что-то похожее для setMapCenterAttribute, которое делает это в обратном порядке, используя pack функцию, если требуется.

...