@alexh7854

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

Здравствуйте.

На сайте нужно загружать данные из csv файла в базу. При этом каждую строку из csv файла нужно проверять в базе.

Данных не должно быть в базе, в базу загружаются только новые данные.

Подскажите как правильно это реализовать?

Я пока реализовал это вот так и думаю что неправильно, загрузка очень медленная, а если в базе много данных, то запрос заканчивается 502 ошибкой.

$wordsFromFile = array_map(function($data) { return str_getcsv($data,";");}, file($request->file('text_file')) );

        // Все слова из базы
        $myWords = Word::all();
        $dbWords = [];

        foreach ($myWords as $myWord) {
            $dbWords[] = $myWord->word;
        }

        $wordsResult= [];
        foreach($wordsFromFile as $key => $data)
        {
            if($key == 0) {continue;}

            $word = isset($data[0]) ? mb_strtolower($data[0]) : "empty_field";
            $translation = isset($data[1]) ? $data[1] : "empty_field";
            $state = isset($data[2]) ? $data[2] : 0;

            //$wordInDatabase = $myWords->where('word', $word)->first();

            if(!in_array($word, $dbWords))
            {
                $wordsResult[] = [
                    'word' => mb_strtolower($word),
                    'translation' => mb_strtolower($translation),
                    'state' => $state,
                ];
            }
        }

        Word::insert($wordsResult);
  • Вопрос задан
  • 63 просмотра
Пригласить эксперта
Ответы на вопрос 1
coderisimo
@coderisimo
При использовании INSERT IGNORE - запись добавится только если он уникальна.
Ответ написан
Ваш ответ на вопрос

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

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