2017-11-05 2 views
0

updateOrCreate Eloquent 메소드를 이해하는 데 문제가 있습니다.Eloquent updateOrCreate()가 모든 행을 덮어 씁니다. 이해하려고 시도합니다.

API에서 정보를 저장하고 매 x 분마다 실행하는 간단한 DB가 있습니다.

내가해야 할 것은 행이 DB에 없거나 다른 방법으로 UPDATE를 수행하고 변경된 데이터를 업데이트하는 경우 INSERT를 수행하는 것입니다.

어떻게하면 Laravel에서이 기능을 사용할 수 있습니까?

내가 지금 당장 가지고있는 것이지만, 모든 행에서 동일한 데이터가 다시 쓰여진다.

정확하게 이해했는지 확실하지 않습니다.

저는 기본적으로 "조건"을 전달합니다. 고유 한 경우 대조해야 할 입력란 - campaign_id + variation_id는 고유해야합니다. (그것은 MySQL의에서 UNIQUE 키에 의해 뒷받침) 내 데이터 배열 :

$data = [ 
    'campaign_id' => $variation['campaign_id'], 
    'variation_id' => $variation['variation_id'], 
    'name' => $variation['name'], 
    'description' => $variation['description'], 
]; 

MyModel::updateOrCreate(['campaign_id' => $variation['campaign_id'], 'variation_id' => 
$variation['variation_id'] ], $data); 

쿼리 빌더 방법이다 updateOrInsert와 함께 작동하는 것 같다,하지만 난, 웅변과이를 달성하고 싶어 쉽게 될 것입니다 생각했다. 플러스 쿼리 빌더가 나를 위해 타임 스탬프를 채우지 않습니다.

어떤 힌트를 주셔서 감사합니다!

+1

보호 된 $ primaryKey 특성을 모델에 설정 했습니까? – fmgonzalez

+0

예, 실제로 설정되었습니다. protected $ primaryKey = 'campaign_id'; 문제가 될 수 있습니까? – depi

답변

0

Laravel의 출처를 보면, updateOrCreate()은 물속에서 firstOrNew($attributes)을 사용합니다. 하나 개 이상의 항목을 기반 $attributes 발견되면

Source

public function updateOrCreate(array $attributes, array $values = []) 
{ 
    return tap($this->firstOrNew($attributes), function ($instance) use ($values) { 
     $instance->fill($values)->save(); 
    }); 
} 

그래서, 단지 그 유사한 항목 중 첫 번째 결과를 업데이트한다.

모든 검색어를 기록하고 코드가 실제로하고있는 사항을 확인하십시오. Logging queries

updateOrCreate()을 사용하면 1 개의 선택 및 1 개의 업데이트 또는 삽입 쿼리가 발생하므로 총 2 개가됩니다.

+0

select * from 'variations' where ('campaign_id' =? 및 variation_id' =?) 제한 1 " "업데이트'variation'은'name' =?,'description' =?,'updated_at' =? where'campaign_id' =? .... 그것은 AND variaiton_id =를 생략했습니다. 조건. 이유는 모르겠다. – depi

+1

그러면 @ fmgonzalez의 의견이 적용됩니다. primaryKey를 campaign_id로 설정 했으므로 Laravel이 고유 값으로 기대합니다. 따라서 1을 찾으면 campaign_id가 해당 모델의 고유 식별자라고 가정하고 업데이트 쿼리에서 나머지를 생략합니다. 필요한 것은 복합 기본 키입니다 (https : // stackoverflow 참조).com/questions/31415213/i-can-put-composite-keys-in-laravel-5 – Robert

+0

복합 키를 사용하여 문제가 해결되었습니다. 패키지 https://github.com/mopo922/LaravelTreats/tree/master/src/Model을로드해야했고 이제 작동합니다. – depi

0

그렇습니다. 나는 느낌이 있었고 @ 로버트는 당신에게 증거를주었습니다. 내가 당신을 위해 잘 작동 희망

protected $primarykey = ['campaign_id', 'variation_id']; 

을 :

는 당신은 모델의 $primaryKey이 방법으로 복합 값으로 설정해야합니다.

+0

이 방법으로 문제가 해결되었지만 복합 키를 지원하려면 https://github.com/mopo922/LaravelTreats/tree/master/src/Model 패키지를로드해야했습니다. – depi