插入第一个重复数据
The First Repeated Data Gets Inserted
我正在使用 Laravel 8 和 LaravelExcel 导入一个 Excel 文件,该文件有一个用户 国家代码 id 和此字段对于每个用户必须是唯一的。
所以我在导入时编码了这个 Class:
$ncodes = DB::table('olympiad_1400')->select('mys_ncode')->get();
$n = 0;
$repeated = [];
foreach($formatArray as $arr){
if($ncodes->isEmpty()){
DB::table('olympiad_1400')->insert([
'mys_name' => $arr['name'],
'mys_ncode' => $arr['nationalCode'],
]);
}else{
if($ncodes[$n]->mys_ncode == $arr['nationalCode']){
DB::table('olympiad_1400')->insert([
'mys_name' => $arr['name'],
'mys_paid_price' => $arr['price'],
]);
}else{
array_push($moghayerat, $arr['nationalCode']);
}
}
}
然后在 Blade,我添加了这个:
@if (session()->has('khata'))
<div class="row justify-content-center">
<div class="col-md-12 ">
<div class="form-group alert alert-danger">
These national codes exist at the DB:
<ul>
@foreach(session('khata') as $khat)
<li>{{ $khat }}</li>
@endforeach
</ul>
</div>
</div>
</div>
@endif
现在这工作正常并拒绝插入重复的国家代码,但它只插入 1st 重复的国家代码!
例如,如果我的 Excel 文件有 10 行(并且所有国家代码已经存在于数据库中),它会插入文件的第 1 行,然后拒绝其他重复的国家代码正确。
那么这里出了什么问题?我怎样才能拒绝所有重复数据的国家代码插入数据库?
更新#1:
当我尝试这段代码时,它工作正常:
$ncodes = DB::table('olympiad_1400')->where('mys_creator_id',auth()->user()->usr_id)->get();
$n = 0;
$repeated = [];
foreach($formatArray as $arr){
if($ncodes->isEmpty()){
DB::table('olympiad_1400')->insert([
'mys_name' => $arr['name'],
'mys_ncode' => $arr['nationalCode'],
]);
}else{
if($ncodes[$n]->mys_ncode == $arr['nationalCode']){
DB::table('olympiad_1400')->insert([
'mys_name' => $arr['name'],
'mys_paid_price' => $arr['price'],
]);
}else{
array_push($moghayerat, $arr['nationalCode']);
}
$n++;
}
}
但是当我删除->where('mys_creator_id',auth()->user()->usr_id)
部分时,它不显示重复数据并将它们全部插入。
原因是,mys_creator_id
of auth()->user()->usr_id
的集合只包含与输入的 $arr['nationalCode']
匹配的集合,如下所示:
$ncodes[$n]->mys_ncode $arr['nationalCode']
1274925657 1274925657
1275119859 1275119859
1274051096 1274051096
1273884817 1273884817
1273884817 1273884817
但是当我删除 where('mys_creator_id',auth()->user()->usr_id)
时,它与返回的集合不匹配,这就是它不断插入重复数据的原因。
所以我需要一些东西来检查在整个集合中是否有重复的国家代码(不仅仅是搜索它的索引)。
如果对此有任何想法或建议,我将不胜感激...
提前致谢。
@nagidi 我检查了你的代码,如果 国家代码 存在于数据库中,你似乎正在插入数据,这是第一个错误:
if($ncodes[$n]->mys_ncode == $arr['nationalCode']){
如果国家代码匹配,您应该跳过插入。
第二个错误是变量 $n 的值永远不会改变,它在您的代码中始终为 0。这就是为什么只有第一行(第 0 个索引)被插入到数据库中的原因。
希望这段代码能解决你的问题
}else{
// Make insert if the national code isn't exist in db
if($ncodes[$n]->mys_ncode !== $arr['nationalCode']){
DB::table('olympiad_1400')->insert([
'mys_name' => $arr['name'],
'mys_paid_price' => $arr['price'],
]);
}else{
array_push($moghayerat, $arr['nationalCode']);
}
$n++; // Increment the value for the key
}
我认为你的问题出在这段代码上
if($ncodes[$n]->mys_ncode == $arr['nationalCode'])
改为
if($ncodes->where('mys_ncode ', $arr['nationalCode'])->isEmpty())
我猜你正在寻找这样的东西:
$ncodes = DB::table('olympiad_1400')->select('mys_ncode')->get();
// First collect all ncodes into a separate array
$usedNCodes = [];
if (!$ncodes->isEmpty()) {
$usedNCodes = array_map(
function($item) {
return $item->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')->insert([
'mys_name' => $arr['name'],
'mys_ncode' => $arr['nationalCode'],
'mys_paid_price' => $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);
我不明白为什么当 table 完全为空并且找不到您的 ID 时,您有不同类型的插入。如果您需要使用相同的 ncode 更新现有记录,请在 else 分支中使用 DB:update
。
我正在使用 Laravel 8 和 LaravelExcel 导入一个 Excel 文件,该文件有一个用户 国家代码 id 和此字段对于每个用户必须是唯一的。
所以我在导入时编码了这个 Class:
$ncodes = DB::table('olympiad_1400')->select('mys_ncode')->get();
$n = 0;
$repeated = [];
foreach($formatArray as $arr){
if($ncodes->isEmpty()){
DB::table('olympiad_1400')->insert([
'mys_name' => $arr['name'],
'mys_ncode' => $arr['nationalCode'],
]);
}else{
if($ncodes[$n]->mys_ncode == $arr['nationalCode']){
DB::table('olympiad_1400')->insert([
'mys_name' => $arr['name'],
'mys_paid_price' => $arr['price'],
]);
}else{
array_push($moghayerat, $arr['nationalCode']);
}
}
}
然后在 Blade,我添加了这个:
@if (session()->has('khata'))
<div class="row justify-content-center">
<div class="col-md-12 ">
<div class="form-group alert alert-danger">
These national codes exist at the DB:
<ul>
@foreach(session('khata') as $khat)
<li>{{ $khat }}</li>
@endforeach
</ul>
</div>
</div>
</div>
@endif
现在这工作正常并拒绝插入重复的国家代码,但它只插入 1st 重复的国家代码!
例如,如果我的 Excel 文件有 10 行(并且所有国家代码已经存在于数据库中),它会插入文件的第 1 行,然后拒绝其他重复的国家代码正确。
那么这里出了什么问题?我怎样才能拒绝所有重复数据的国家代码插入数据库?
更新#1:
当我尝试这段代码时,它工作正常:
$ncodes = DB::table('olympiad_1400')->where('mys_creator_id',auth()->user()->usr_id)->get();
$n = 0;
$repeated = [];
foreach($formatArray as $arr){
if($ncodes->isEmpty()){
DB::table('olympiad_1400')->insert([
'mys_name' => $arr['name'],
'mys_ncode' => $arr['nationalCode'],
]);
}else{
if($ncodes[$n]->mys_ncode == $arr['nationalCode']){
DB::table('olympiad_1400')->insert([
'mys_name' => $arr['name'],
'mys_paid_price' => $arr['price'],
]);
}else{
array_push($moghayerat, $arr['nationalCode']);
}
$n++;
}
}
但是当我删除->where('mys_creator_id',auth()->user()->usr_id)
部分时,它不显示重复数据并将它们全部插入。
原因是,mys_creator_id
of auth()->user()->usr_id
的集合只包含与输入的 $arr['nationalCode']
匹配的集合,如下所示:
$ncodes[$n]->mys_ncode $arr['nationalCode']
1274925657 1274925657
1275119859 1275119859
1274051096 1274051096
1273884817 1273884817
1273884817 1273884817
但是当我删除 where('mys_creator_id',auth()->user()->usr_id)
时,它与返回的集合不匹配,这就是它不断插入重复数据的原因。
所以我需要一些东西来检查在整个集合中是否有重复的国家代码(不仅仅是搜索它的索引)。
如果对此有任何想法或建议,我将不胜感激...
提前致谢。
@nagidi 我检查了你的代码,如果 国家代码 存在于数据库中,你似乎正在插入数据,这是第一个错误:
if($ncodes[$n]->mys_ncode == $arr['nationalCode']){
如果国家代码匹配,您应该跳过插入。
第二个错误是变量 $n 的值永远不会改变,它在您的代码中始终为 0。这就是为什么只有第一行(第 0 个索引)被插入到数据库中的原因。
希望这段代码能解决你的问题
}else{
// Make insert if the national code isn't exist in db
if($ncodes[$n]->mys_ncode !== $arr['nationalCode']){
DB::table('olympiad_1400')->insert([
'mys_name' => $arr['name'],
'mys_paid_price' => $arr['price'],
]);
}else{
array_push($moghayerat, $arr['nationalCode']);
}
$n++; // Increment the value for the key
}
我认为你的问题出在这段代码上
if($ncodes[$n]->mys_ncode == $arr['nationalCode'])
改为
if($ncodes->where('mys_ncode ', $arr['nationalCode'])->isEmpty())
我猜你正在寻找这样的东西:
$ncodes = DB::table('olympiad_1400')->select('mys_ncode')->get();
// First collect all ncodes into a separate array
$usedNCodes = [];
if (!$ncodes->isEmpty()) {
$usedNCodes = array_map(
function($item) {
return $item->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')->insert([
'mys_name' => $arr['name'],
'mys_ncode' => $arr['nationalCode'],
'mys_paid_price' => $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);
我不明白为什么当 table 完全为空并且找不到您的 ID 时,您有不同类型的插入。如果您需要使用相同的 ncode 更新现有记录,请在 else 分支中使用 DB:update
。