Как правильно обновить данные в приложениях по запросу?

Есть бэкенд для мобильных приложений на Laravel к которому поступает запрос на обновление данных в json формате
'data': [
     {'table': 'Product', 'updated_at': <timestamp>}
  ],

В бэкенде выбираются все данные из переданной в запросе таблицы, которые свежее указанного там же updated_at таймстемпа и возвращаются jsonом
public function handle()
    {
        $requestData = request('data');

        $responseData = [];

        foreach ($requestData as $item) {
            $model = "\\App\\" . $item['table'];
            $updated = $item['updated_at'];

            $collection = $model::where('updated_at', '>', $updated)->get();

            if ($collection->count()) {
                $maxUpdatedAt = $collection->pluck('updated_at')->max();

                $responseData[] = [
                    'updated_at' => $maxUpdatedAt,
                    'table' => $item['table'],
                    'data' => $collection->toArray()
                ];
            }

        }

        $response = ['action' => 'update', 'data' => $responseData];

        return response()->json($response);
    }

Возникает вопрос - что делать при огромном количестве запросов? Кеширование в данном случае видимо не подходит. Какие решения подходят для подобных задач? Читал про Broadcasting, но это несколько другой подход и можно ли его использовать в данном случае?
  • Вопрос задан
  • 174 просмотра
Пригласить эксперта
Ответы на вопрос 1
Razgelday
@Razgelday
Вы явно свернули куда-то не туда, когда начали делать один запрос для получения данных сразу из нескольких таблиц.

1) Лучше придерживаться ресурсного подхода (RESTful API), тогда не будет таких проблем.

В Laravel есть встроенные методы для реализации RESTful API, например resource-controllers (https://laravel.com/docs/master/controllers#resour...

При RESTful подходе вам надо будет делать по 1 запросу для каждой таблицы - это не должно вызывать проблем в большинстве случаев. Если число таблиц у вас огромное - тогда, скорее всего, вы что то не так спроектировали или вам нужно рассмотреть другой тип базы данных (может, ClickHouse? ).

2) Для стандартизации запросов и ответов используйте https://jsonapi.org/.
Для этого есть хорошие пакеты: https://github.com/spatie/laravel-query-builder (бекенд) и https://github.com/robsontenorio/vue-api-query (JS фронт, можно использовать даже в ReactNative).
Если для вас это слишком просто, то посмотрите в сторону GraphQL.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы