2017-05-17 79 views
4

我從其他服務獲取JSON並希望在表中插入一堆數據。我想這樣做,它不會每次運行時都會崩潰。我想保留我的表的唯一約束(因爲我不想插入相同的數據兩次),但是,我不希望laravel如果發生致命錯誤(僅在特定的表上) )。laravel雄辯插入重複密鑰時忽略錯誤

如何插入我的數據並繼續插入,如果我嘗試插入另一個具有重複主鍵的數據?

Schema::create('dummy', function (Blueprint $table) { 
    $table->integer('id')->unique(); 

    $table->string('name',100); 
}); 

從另一個API中獲取一堆JSON。然後插入所有行:

{ 
    'id':1, 
    'name': 'one' 
},{ 
    'id':2 
    'name':'two' 
} 

那使。

DB::table('dummy')->insert([ 
    ['id' => 1, 'name' => 'one'], 
    ['id' => 2, 'name' => 'two'] 
]); 

然後又有一天,第三方API有新的數據。而想要更新我的數據庫:

獲取JSON和接收:

{ 
    'id':1, 
    'name': 'one' 
},{ 
    'id':2 
    'name':'two' 
},{ 
    'id':3 
    'name':'three' 
} 

,使得:

DB::table('dummy')->insert([ 
    ['id' => 1, 'name' => 'one'], // <-- will crash there cause PK already existe, but want to keep inserting 
    ['id' => 2, 'name' => 'two'], // <-- skipp cause already exist 
    ['id' => 3, 'name' => 'three'] // insert that line. 
]); 
+1

您可以想出處理重複項的自定義查詢(例如ON DUPLICATE KEY UPDATE)以提高效率。或者,您將包含將數據插入到表中的代碼片段放在try {...} catch(\ Exception $ e)中{//出錯了。 } – adelineu

+0

@tadman我雖然很清楚 –

+1

這是一個特定的問題,但是如果你包含了一小段代碼來證明問題,那將是非常明確的。 – tadman

回答

1

您可以嘗試捕捉PDO例外

try 
{ 
    // inserting in DB; 
} 
catch(\Illuminate\Database\QueryException $e){ 
    // do what you want here with $e->getMessage(); 
} 

另外,但不知道,你可以嘗試數據庫交易:

public function insertInDB() 
{ 
    DB::transaction(function() { 
     DB::table(...); 
     // if everything is fine, it will commit, else, it will rollback 
    } 
}