Isolution666
@Isolution666
Full-Stack Developer

Yii2, как вставить в sql запрос coalesce поле, массив из API?

Здравствуйте.
--
Моя предыстория:
Есть стороннее API - https://www.bridgeinteractive.com
Документация - https://rets.ly/docs/platform/
Данное API просто выводит данные о недвижимости в виде json
Есть приложение на Yii2, на котором есть свой API который тоже выводит данные в виде json
Я пытаюсь на выходе объединить SQL запрос из ActiveRecord с полученным из другого API json.
Может я делаю что-то не так, или так сделать нельзя, ведь с Bridge API нельзя сделать связь
Во время коллизии я получаю лишь ключ, по которому могу потом выдёргивать данные недвижимости.
Получается вьюшка из всех сделок, и получение одной конкретной сделки которая отдаёт данные в виде JSON.
Проблема в том что мне надо делать два запроса на две API, и уже на фронте связать два полученных json в один.

Чтобы вы понимали, я могу задать SQL запрос, что-то типа:

SELECT d.*,  coalesce(o.key, 0) as realestate FROM deals ...

То есть создать дополнительное поле (столбец), которого нет в БД
(Я сейчас не про запрос, как создать столбец в базе данных)
Так вот o.key === Bridge API, если данных нет, и чтобы избежать ошибок, пустую ячейку я заполняю нулём, а столбец, куда будут прилетать данные из Bridge API назову например "realestate".
В случае с SQL в одной базе данных, такой финт провернуть вообще легко, появляется несуществующий столбец, в котором вписываются данные из другой таблицы.

Как я это вижу. Объявляют что у файла JSON заголовок, получаю все записи из БД, получаю по ключу все данные из Bridge API и объединяю в один массив, который пропускаю через цикл, таким образом, объединив разные json в один, через цикл я вывожу все записи уже с объектами (недвижимость).

Какое НО.
Дело в том, что в Bridge API данные постоянно меняются кроме ключа,
по которому можно получить данные о недвижимости. Как я понял, обновляется каждую секунду, по крайней мере через библиотеку axios в React JS, из-за этого лимит постоянно заканчивается, чего не скажешь, если данные приходят через cURL в php.
Объектов недвижимости может быть сколько угодно, хоть 30000 хоть 40000.
Сделок в API тоже может быть сколько угодно.
Я переживаю за нагрузку и за скорость получения данных. Их число растёт, и кто знает сколько данных будет ещё.
6054fb2820346853304538.jpeg

Как видите, по данному ключу можно получить данные недвижимости, и такой же ключ есть в API другого сайта. Как лучше связать эти данные в единый json без потери производительности и скорости, пока не понимаю. Может быть кто-то что-то подобное делал. Через hasOne я пытался, но видимо не правильно что-то делаю.
public function getRealestate(){
        return $this->hasOne(...);
    }


Deals::find()->with('realestate')->where(['key' => $key])->asArray()->all();


Что посоветуете. Заранее благодарю за помощь и отзывчивость.
  • Вопрос задан
  • 130 просмотров
Решения вопроса 1
Isolution666
@Isolution666 Автор вопроса
Full-Stack Developer
Смысл был в том, чтобы разные данные соединить в один массив,
и да Yii2 тут не при чём, это решается на чистом PHP:
public static function viewAllOrders($uuid)
    {
        $url = self::url().'internalorder/'.$uuid;
        $response = self::get($url);
        $items = $response->json();
        $array = [];
        foreach($items['rows'] as $item) {
            $array[] = [
                'id' => $item['id'],
                'name' => $item['name'],
                'created' => $item['created'],
                'sum' => $item['sum'],
                'vatSum' => $item['vatSum'],
                'size' => $item['positions']['meta']['size'],
                'state' => self::getInvoiceoutMetadataStates($item['state']['meta']['href'])
            ];
        }
        return [
            'count' => $items['meta']['size'],
            'rows' => $array
        ];
    }

На выходе можно получить json который будет объединён из разных данных в единый ответ единоразово. Буду рад если кому-то помог с этим.
Решение нашёл сам, готовых ответов не было.
Использовать данное решение только на свой страх и риск.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы