Вставляются Первые Повторяющиеся Данные

#php #laravel #laravel-5.8 #laravel-excel

#php #ларавель #ларавель-5,8 #laravel-excel

Вопрос:

Я работаю с Laravel 8 и LaravelExcel для импорта файла Excel, в котором указан идентификатор национального кода пользователя, и это поле должно быть уникальным для каждого пользователя.

Поэтому я закодировал это в классе импорта:

 $ncodes = DB::table('olympiad_1400')-gt;select('mys_ncode')-gt;get(); $n = 0;  $repeated = []; foreach($formatArray as $arr){  if($ncodes-gt;isEmpty()){  DB::table('olympiad_1400')-gt;insert([  'mys_name' =gt; $arr['name'],  'mys_ncode' =gt; $arr['nationalCode'],  ]);  }else{  if($ncodes[$n]-gt;mys_ncode == $arr['nationalCode']){  DB::table('olympiad_1400')-gt;insert([  'mys_name' =gt; $arr['name'],  'mys_paid_price' =gt; $arr['price'],  ]);  }else{  array_push($moghayerat, $arr['nationalCode']);  }  } }    

Теперь, на Лезвии, я добавил это:

 @if (session()-gt;has('khata'))  lt;div class="row justify-content-center"gt;  lt;div class="col-md-12 "gt;  lt;div class="form-group alert alert-danger"gt;  These national codes exist at the DB:   lt;ulgt;  @foreach(session('khata') as $khat)  lt;ligt;{{ $khat }}lt;/ligt;  @endforeach  lt;/ulgt;  lt;/divgt;  lt;/divgt;  lt;/divgt;  @endif  

Теперь это работает нормально и отклоняет вставку повторяющихся национальных кодов, но он вставляет ТОЛЬКО 1-й повторяющийся национальный код!

Например, если мой файл Excel содержит 10 строк (и все национальные коды уже существуют в базе данных), он вставляет 1-ю строку файла, а затем правильно отклоняет другие повторяющиеся национальные коды.

Так что же здесь происходит не так? Как я могу отказаться от вставки в БД ВСЕГО Национального кода повторяющихся данных?


ОБНОВЛЕНИЕ № 1:

Когда я пробую этот код, он работает нормально:

 $ncodes = DB::table('olympiad_1400')-gt;where('mys_creator_id',auth()-gt;user()-gt;usr_id)-gt;get();  $n = 0;  $repeated = []; foreach($formatArray as $arr){  if($ncodes-gt;isEmpty()){  DB::table('olympiad_1400')-gt;insert([  'mys_name' =gt; $arr['name'],  'mys_ncode' =gt; $arr['nationalCode'],  ]);  }else{  if($ncodes[$n]-gt;mys_ncode == $arr['nationalCode']){  DB::table('olympiad_1400')-gt;insert([  'mys_name' =gt; $arr['name'],  'mys_paid_price' =gt; $arr['price'],  ]);  }else{  array_push($moghayerat, $arr['nationalCode']);  }  $n  ;  } }  

Но когда я удаляю -gt;where('mys_creator_id',auth()-gt;user()-gt;usr_id) деталь, она не показывает повторяющиеся данные и вставляет их все.

Причина этого в том, что коллекция с mys_creator_id из auth()-gt;user()-gt;usr_id содержит только коллекцию, которая совпадает с введенной $arr['nationalCode'] таким образом:

 $ncodes[$n]-gt;mys_ncode $arr['nationalCode']  1274925657 1274925657 1275119859 1275119859 1274051096 1274051096 1273884817 1273884817 1273884817 1273884817  

Но когда я удаляю where('mys_creator_id',auth()-gt;user()-gt;usr_id) его , он не соответствует возвращенной коллекции, и поэтому он продолжает вставлять повторяющиеся данные.

Поэтому мне нужно что-то, чтобы проверить всю коллекцию на наличие повторяющегося национального кода (а не просто искать его индекс).

Я был бы очень признателен за любую идею или предложение по этому поводу…

Заранее спасибо.

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

1. Не добавляйте новый код в свой вопрос, не удалив старый код, который он заменяет.

2. Этот вопрос нуждается в серьезном разъяснении. Каковы условия, при которых вы хотите вставить запись? Почему ваш код содержит 2 разных запроса на вставку? Каковы условия, определяющие, что используется? Представленный код выполняет вставку только в том случае, если $ncodes коллекция пуста, но вы не упоминаете об этом в своем вопросе. Что такое $repeated ? Что такое $moghayerat ? Почему вы проверяете только один элемент $ncodes на совпадение? Какое отношение код Блейда имеет к вашей проблеме?

3. Как предложил @miken32, любезно объясните вашу проблему с образцом массива. Мы не можем определить, в каких случаях вам необходимо создать запись

Ответ №1:

Я думаю, вы ищете что-то вроде этого:

 $ncodes = DB::table('olympiad_1400')-gt;select('mys_ncode')-gt;get();  // First collect all ncodes into a separate array $usedNCodes = []; if (!$ncodes-gt;isEmpty()) {  $usedNCodes = array_map(  function($item) {  return $item-gt;mys_ncode  },  $ncodes  ); }  $repeated = []; foreach($formatArray as $arr){  if (!in_array($usedNCodes, $arr['nationalCode']) {  // Insert all data if ncode was not found  DB::table('olympiad_1400')-gt;insert([  'mys_name' =gt; $arr['name'],  'mys_ncode' =gt; $arr['nationalCode'],  'mys_paid_price' =gt; $arr['price'],  ]);   // Also add new ncode to the used ncodes array, so duplicates from the $formatArray won't be inserted anyway.  $usedNCodes[] = $arr['nationalCode'];  } else {  $repeated[] = $arr['nationalCode'];  } }  // If $formatArray had duplicates and you only need them once in the $repeated array $repeated = array_unique($repeated);  

Я не понял, почему у вас разные виды вставок для случаев, когда таблица полностью пуста и когда вы не нашли свой идентификатор. Если вам нужно было обновить существующие записи с тем же ncode, используйте DB:update в ветке else.

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

1. Вы могли бы просто сделать DB::table('olympiad_1400')-gt;pluck('mys_ncode')

Ответ №2:

Я думаю, что ваша проблема в этом коде

 if($ncodes[$n]-gt;mys_ncode == $arr['nationalCode'])  

измените его на

 if($ncodes-gt;where('mys_ncode ', $arr['nationalCode'])-gt;isEmpty())  

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

1. Не работает, я только что сделал обновление № 1 , пожалуйста, проверьте это

Ответ №3:

@nagidi Я проверил ваш код, и, похоже, вы вставляете данные, если Национальный код существует в базе данных, что является первой ошибкой:

 if($ncodes[$n]-gt;mys_ncode == $arr['nationalCode']){  

Вы должны пропустить вставку, если национальный код совпадает.

Вторая ошибка заключается в том, что значение переменной $n никогда не меняется, в вашем коде оно всегда равно 0. Вот почему в базу данных была вставлена только первая строка (0-й индекс).

Я надеюсь, что этот код решит вашу проблему

 }else{  // Make insert if the national code isn't exist in db  if($ncodes[$n]-gt;mys_ncode !== $arr['nationalCode']){   DB::table('olympiad_1400')-gt;insert([  'mys_name' =gt; $arr['name'],  'mys_paid_price' =gt; $arr['price'],  ]);  }else{  array_push($moghayerat, $arr['nationalCode']);  }  $n  ; // Increment the value for the key }  

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

1. Спасибо, что ответили. Половина вашего ответа была правильной, и я только что добавил ОБНОВЛЕНИЕ № 1 об этом. Пожалуйста, проверьте это.