我想使用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 [▶]。 。 。等
答案 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
});