#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 об этом. Пожалуйста, проверьте это.