2013-07-08 47 views
1

我嘗試這樣做:Laravel 4,打開DB ::選擇到雄辯對象

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

這樣,它會觸發performUpdate()方法,而不是performInsert()

+0

我認爲這是奇怪的,我不得不手動說它存在,但我猜存在的屬性是公開的原因。看起來不錯,我會標記正確的,如果它的工作。 –

0

這個怎麼樣,而不是...

$競選=廣告活動::發現((INT)$數據[ 'CAMPAIGN_ID']);

$ campaign-> counter + = 1;

$ campaign-> save();

+0

我不能使用'FOR UPDATE'來以這種方式鎖定記錄。 –

+0

只是爲了記錄,現在您可以使用sharedLock和lockForUpdate進行悲觀鎖定(http://laravel.com/docs/queries#pessimistic-locking) –