2013-07-08 4 views
1

웅변 객체로 선택 :: DB를 돌Laravel 4, 나는이 시도

$result = (array)DB::selectOne('SELECT * FROM campaign WHERE id = ? FOR UPDATE', [$data['campaign_id']]); 
$campaign = new Campaign($result); 
$campaign->counter += 1; 
$campaign->save(); 

를하지만 나는 새로운 캠페인이 아닌 작업을 시도하고 생각하기 때문에 나는 Integrity constraint violation: 1062 Duplicate entry '1' for key 저장에이 오류가 기존 하나.

편집 : 기본 키가 설정되어 있어도 존재하지 않는 이유는 무엇입니까?

+0

대신에 왠지 또는 유창하게 사용하지 않습니까? –

+0

나는 웅변을하기에는 너무 앞서 있다고 생각한다. 테이블 행을 잠글 필요가있어. 내 쿼리에서'FOR UPDATE'를 사용하고있는 것을 볼 수 있습니다. 나는 그 일을하는 법이나 웅변적인 관습을 알아낼 수 없었다. –

+0

트랜잭션을 명시 적으로 정의 하시겠습니까? ([show here] (http://stackoverflow.com/questions/15105640/laravel-eloquent-orm-transactions)) 도움이 될까요? – fideloper

답변

3

개체를 저장하기 전에 $exists 속성을 true로 설정하는 것이 한 가지 방법입니다.

$campaign->exists = true; 
$campaign->save(); 

이 방법 대신 performInsert()performUpdate() 방법을 트리거합니다.

+0

나는 그것이 수동으로 존재한다고 말해야한다는 것이 이상하다고 생각하지만, 존재하는 속성이 이유 때문에 공개적이라고 생각한다. 좋은데, 제대로 작동하면 올바르게 표시 할 것입니다. –

0

이 방법에 대해 대신 ...

$ 캠페인 = 캠페인 :: 찾기 ((int)에 $ 데이터 [ 'CAMPAIGN_ID']);

$ campaign-> counter + = 1;

$ campaign-> save();

+0

이렇게하면 레코드를 잠그는 데 'FOR UPDATE'를 사용할 수 없습니다. –

+0

레코드 용으로 이제는 sharedLock 및 lockForUpdate (http://laravel.com/docs/queries#pessimistic-locking)를 사용하여 비관적 잠금을 수행 할 수 있습니다. –