Эффективный способ получить данные из базы данных в foreach - PullRequest
0 голосов
/ 14 апреля 2019

Я загружаю данные из Excel. В foreach я проверяю для каждой записи, существует ли она в базе данных:

$recordExists = $this->checkIfExists($record);

function checkIfExists($record) {
    $foundRecord = $this->repository->newQuery()
        ->where(..., $record[...])
        ->where(..., $record[...])
        ...
        ->get();
}

Когда в Excel содержится до 1000 значений, что является относительно небольшим фрагментом данных - код выполняется около 2 минут. Я предполагаю, что это очень неэффективный способ сделать это.

Я думал о передаче массива загруженных данных методу checkIfExists, но тогда я не смог запросить данные.

Каков будет путь?

Ответы [ 2 ]

0 голосов
/ 14 апреля 2019

Если вы передаете все данные из базы данных в функцию (так что больше нет запросов к базе данных), вы можете использовать функции коллекций laravel для фильтрации.

из них where => https://laravel.com/docs/5.8/collections#method-where

function checkIfExists($record, Collection $fetchedDataFromDatabase) {

    // laravel collectons 'where' function
    $foundRecord = $fetchedDataFromDatabase
        ->where(..., $record[...])
        ->where(..., $record[...]);
}

другие полезные функции.

  • фильтр
  • содержит
0 голосов
/ 14 апреля 2019

Вы можете использовать очередь Laravel, если вы хотите сделать много работы в течение очень короткого времени.Ваш код будет работать на бэкэнде.Клиент не может распознать процесс.просто покажите клиенту сообщение, что этот процесс находится в очереди.Вот и все

Вы можете проверить официальную документацию ниже URL https://laravel.com/docs/5.8/queues

...