@cryp24

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

Вообщем есть массив 10 записей, есть таблица 10000 записей. Необходимо определить каких записей в массиве нет в таблице и их потом вставить. До этого у меня было так
$select_all_news = DB::select("select * from news WHERE author='автор'");

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

сейчас переделал так
for ($x=0; $x<count($all_news['url']); $x++)
        {
            if(!DB::table('news')->where('source',$all_news['url'][$x])->where('author',$author)->first())
            {
                $unic_news[$x]['url']=$all_news['url'][$x]; 
                $unic_news[$x]['preview_img']=$all_news['preview_img'][$x];
                $unic_news[$x]['title']=$all_news['title'][$x];
                $unic_news[$x]['small_description']=$all_news['small_description'][$x];
            }
        }


В данном случае получается 10 запросов, так как идет сверка именно по каждой записи.

Какой вариант более правильный и почему?
  • Вопрос задан
  • 130 просмотров
Решения вопроса 1
xpert13
@xpert13
Full Stack Developer
Второй вариант имеет право на существование. Дополнительно я бы советовал вам добавить индексы на связку полей "source" и "author" для ускорения поиска. А так же не делать ->first() для проверки существования записи, для этого есть метод exists.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Запросы в циклах это очень плохо, всегда желательно от этого избавляться.
У вас обязательно должен быть ключ уникальности в БД, чтобы небыло дубляжей. Когда вы это сделаете, можно использовать insert ignore
Ваш же код можно упростить, использовавши firstOrCreate метод

Чтобы избавится от запросов в цикле вам нужно
1. Сделать запрос в базу whereIn
2. Пройтись циклом по тому что найдено и отфильтровать
3. Оставшееся добавить через один insert
Таким образом у вас будет только два запроса
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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