如果数据库中已经存在行,则不要导入

时间:2018-09-19 21:28:26

标签: php laravel

我想使用Laravel 5.7将项目从我的CSV文件导入到MSSQL数据库。在我的CSV文件中,第一列是item_ids,第二列是description。 现在如何设置为不下载ID已在数据库中的项目? ItemController:

var arrayContent = [["Séjour 1, é,í,ú,ü,ű"],["Séjour 2, é,í,ú,ü,ű"]];
var csvContent = arrayContent.join("\n");
var link = window.document.createElement("a");
link.setAttribute("href", "data:text/csv;charset=utf-8,%EF%BB%BF" + encodeURI(csvContent));
link.setAttribute("download", "upload_data.csv");
link.click(); 

ItemRequest:

public function import(Item $item, Request $request)
    {
        if ($request->hasFile('itemsfile')) {
            if ($request->itemsfile->getClientOriginalExtension() == 'csv')
            {
                $rowCount = 0;
                $csvAsArray = array_map(function($v){return str_getcsv($v, ";");}, file($request->file('itemsfile')));
                foreach($csvAsArray as $row)
                {
                    if(count($row)>=2){
                        if(trim($row[0]) != '' && trim($row[1]) != '') {
                            $item= new Item();
                            $item->item_id= $row[0];
                            $item->description= $row[1];
                            $item->save();
                            $rowCount++;
                        }
                    } else {
                    }
                }
                return redirect()->route('admin.items');
            }
            else {
                return back();
            }
        }
        else {
            return back();
        }
    }

当我添加新项目(不导入)时,唯一的ID号检查可以正常工作,但是当我想从CSV文件导入数据包并且不导入数据库中已经存在的行时,整个CSV将被导入。 谢谢你的帮助! dd(csvAsArray);

  

数组:30 [▼0 =>数组:2 [▼       0 =>“ Desc 1”       1 =>“ 123456789”] 1 => array:2 [▶]。 。 。等

1 个答案:

答案 0 :(得分:1)

您需要检查数据库中是否已经有数据:

if(Item::where('item_id','=',$row[0])->count() == 0) {
    $item= new Item();
    $item->item_id= $row[0];
    $item->description= $row[1];
    $item->save();
    $rowCount++;
}

此外,如果您有唯一的规则,则应在迁移文件中执行相同的操作。 您可能会遇到这样的事情:

Schema::create('Item', function (Blueprint $table) {
    $table->integer('item_id');
});

然后使用唯一规则创建新迁移

Schema::table('Item', function (Blueprint $table) {
    $table->unique('item_id'); //add unique rule
});