2017-05-17 1 views
4

다른 서비스에서 JSON을 가져 와서 테이블에 많은 데이터를 삽입하려고합니다. 나는 그것을 실행할 때마다 충돌하지 않는 방식으로하고 싶다. 테이블의 내 PK에 내 고유 한 제약 조건을 유지하고 싶습니다. (동일한 데이터를 두 번 삽입하지 않으려 고하지만) 특정 테이블에서만 laravel이 치명적인 오류를 발생시키지 않도록하고 싶습니다.).중복 키를 삽입 할 때 laravel eloquent가 오류를 무시합니다.

데이터를 삽입하고 중복 된 기본 키가있는 다른 데이터를 삽입하려고하면 어떻게 삽입합니까?

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(); 
} 

을 잡기 시도 할 수

, 확실하지는 않지만 DB 트랜잭션을 시도 할 수 있습니다.

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