Запрос к базе данных, который принимает случайные данные только один раз

#android #mysql #laravel #api

#Android #mysql #laravel #API

Вопрос:

В настоящее время я создаю API для marketplace на Android, используя разбивку на страницы, которая загружает только первые 20-40 данных и использует Laravel в качестве серверной части. Есть ли какой-либо запрос, который выбирает случайные данные, но данные загружаются только один раз? например, в mysql: A B C D E F

первый вызов api с использованием inRandomOrder-> take(3): A, B, E

но во втором вызове: C, D, F

Редактировать: Добавить функцию inRandomOrder

Редактировать дополнительное объяснение: я хочу получить случайные 20 элементов данных (всего 1000 данных).. поскольку я использую like infinite scroll, я не хочу загружать все 1000 данных сразу (проблемы с производительностью).. поэтому, когда я хочу загрузить больше данных, мне нужно снова вызвать API, но если вы используете случайный порядок, есть вероятность, что данные загрузятся дважды или больше..

то есть: есть 6 данных (A, B, C, D, E, F), которые сначала вызываются в случайном порядке (A, B, F), но при втором вызове будут загружены C, D, E

извините, если это неправильный способ задать вопрос .. я впервые задаю вопрос в stackoverflow

Ответ №1:

Вам пришлось бы где-то сохранять их, сколько раз к вашему api обращались.

Я бы сделал это, отправив счетчик с вашим вызовом api вместо этого

Очень простой метод:

РЕДАКТИРОВАТЬ: добавлено принимать

Маршрут:

  Route::get('getdata/{counter}/{take}', ['uses' => 'APIController@getdata']);
  

Контроллер:

 public function getdata($counter, $take) {
  Model::skip($counter)->orderByRaw("RAND()")->take($take)->get();
}
  

РЕДАКТИРОВАТЬ: добавлен orderByRaw

Итак, в вашем вызове api добавьте url.com/howmanytoskip/howmanytotake/

В вызове api: вы должны увеличить пропуск, количество загруженных и уменьшить количество использований, чтобы вы получали меньше элементов при загрузке.

Комментарии:

1. извините, я забыл добавить функцию inRandomOrder, есть ли какой-либо способ добиться этого, используя случайный порядок?

2. Я попробовал это, используя ваш метод, но он по-прежнему возвращает те же данные.. Мой первый вызов (по идентификатору): 9,10,15,7,6 Мой второй вызов: 9,13,12,15,10

Ответ №2:

Просто выполните случайный поиск, используя функцию inRandomOrder().

PD: OP не предоставил достаточно информации, поэтому я собираюсь использовать User модель в качестве примера.

Определите свою конечную точку:

 /** api.php */

use AppHttpControllersUserController;

// ...

Route::get('/random-users', [UserController::class, 'getRandom']);
  

Затем в вашем контроллере:

 /** UserController.php */

use AppUser;

// ...

public function getRandom()
{
    $users = User::inRandomOrder() // <--- randomizing
                        ->take(3) // <--- limiting response to 3 items
                        ->get(); // <--- getting the results

    return response()->json(['users' => $users], 200);
}
  

Итак, теперь просто сделайте GET вызов ранее определенной конечной точки, и вы получите свои случайные данные:

 GET http://www.my-website.com/api/random-users