Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Всем привет. Laravel 9 (думаю будет актуально и для других версий), база PostGIS.
Условия:
Есть таблица с координатами, данные из которой должны передаваться по апи.
Schema::create('locations', function (Blueprint $table) {
$table->id('location_id');
$table->point('geometry'); // geography(point, 4326)
$table->bigInteger('shop_id');
$table->timestamps();
});
Соответсвенно и запрос на получение координат содержит функцию преобразования ST_AsGeoJSON.
SELECT shop_id, ST_AsGeoJSON(geometry) from locations;
Вопрос:
Как получить уже преобразованные координаты с помощью ST_AsGeoJSON, в запросе через связанную таблицу?
$shop = Shops::first();
$shop->locations;
Изменено minsk_sanek (16.11.2022 22:47:58)
Не в сети
А кроме координат со связанными данными всё окей? Что насчет чтения locations напрямую без реляции с shops?
Из текста не очевидно в чем именно проблема - настроена ли связь таблиц, добавляли ли casts.
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Не в сети
Спасибо что написали.
Со связями все окей.
Casts не пробовал потому что он по моему подготавливает данные перед сохранением в бд методом set и преобразовывает значение из бд после того как данные были извлечены из бд метод get. В базе нужно чтоб хранились именно координаты.
Здесь у меня в поле geometry сохраняются координаты вот так:
'geometry' => DB::raw("ST_GeomFromText('POINT(" . $request->get('latitude') . " " . $request->get('longitude') . ")', 4326)"),
Из базы данных потом достаю:
Location::select('shop_id', DB::raw('ST_AsGeoJSON(geometry) as geometry'))...
Думал может есть красивое решение чтоб сразу получать локацию в запросе через связанную таблицу.
Не в сети
Если единственный вариант прочитать гео-информацию в удобном виде это вызов функции БД, то наверное тебе помогут представления (view) на уровне базы. Подключай вью с уже преобразованными данными вместо таблицы. И не будет никакой разницы через связь ты добираешься до поля, или без неё.
CREATE VIEW v_locations AS SELECT ST_AsGeoJSON(geometry) as geometry ... FROM locations
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Не в сети
class Locatiobn extends Model
{
public $table = 'v_locations';
. . .
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Не в сети
Спасибо большое!!! Вы очень помогли!
Не в сети
Страницы 1