Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 16.11.2022 22:46:47

Преобразование поля Eloquent

Всем привет. 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)

Не в сети

#2 23.11.2022 16:30:25

Re: Преобразование поля Eloquent

А кроме координат со связанными данными всё окей? Что насчет чтения locations напрямую без реляции с shops?

Из текста не очевидно в чем именно проблема - настроена ли связь таблиц, добавляли ли casts.


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#3 25.11.2022 22:52:01

Re: Преобразование поля Eloquent

Спасибо что написали.
Со связями все окей.
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'))...

Думал может есть красивое решение чтоб сразу получать локацию в запросе через связанную таблицу.

Не в сети

#4 27.11.2022 11:48:31

Re: Преобразование поля Eloquent

Если единственный вариант прочитать гео-информацию в удобном виде это вызов функции БД, то наверное тебе помогут представления (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.

Не в сети

#5 27.11.2022 11:50:52

Re: Преобразование поля Eloquent

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.

Не в сети

#6 27.11.2022 22:14:46

Re: Преобразование поля Eloquent

Спасибо большое!!! Вы очень помогли!

Не в сети

Подвал раздела