插入第一个重复数据

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