2017-09-14 71 views
3

在我的代碼中,我試圖在調用控制器函數時創建一個鎖定實體。一旦我創建新實體,我將其保存在數據庫中。一旦控制器函數完成其邏輯的其餘部分,我在返回重定向之前更新鎖實體。但是,當我更新實體並再次保存時,它總會插入一個新的數據庫行,而不是更新現有的實體。保存更新實體而不是插入

我到目前爲止嘗試過的東西。

  • 我打電話給$ entity-> isNew(false);
  • 我用find()方法更新之前獲得實體和保存
  • 二手patchEntity方法之前保存()

這兩種方法都應該更新是否新款()信號保存()來更新條目而不是插入一個新的條目,但是我總是會獲得一個添加到數據庫的新行。

這裏是相關代碼。

這是我的控制器功能

//Inside of edit function of controller 

$editLockTable = TableRegistry::get('TableLocks'); 
$editLock = newEntity($userId, $postId); 
$editLock->lock(); 
if(!$editLockTable->save($editLock)){ 
    Throw new \Exception("Error with saving lock"); 
} 
. 
. // Some other controller function code 
. 
$editLock->unlock(); 
$editLock->isNew(false); 
if(!editLockTable->save($editLock)){ 
    Throw new \Exception("Error with saving unlock"); 
} 
//return redirect 

這裏裏面的邏輯是我的實體類

//Inside of Entity class for EditLock 

public function lock($userId, $postId){ 
    $this->user_id = $userId; 
    $this->post_id = $postId; 
    $this->start_time = Time::now(); 
    $this->is_locked = true; 
    $this->expire_time = Time::now()->modify('+10 minutes'); 
} 

public function unlock(){ 
    $this->end_time = Time::now(); 
    $this->is_locked = false; 

edit_locks表定義內部的邏輯

CREATE TABLE 'edit_locks' (
    'id' int(11) NOT NULL AUTO_INCREMENT, 
    'post_id' int(11) NOT NULL, 
    'user_id' int(11) NOT NULL, 
    'is_locked' tinyint(1) DEFAULT '0', 
    'start_time' datetime DEFAULT '0000-00-00 00:00:00', 
    'end_time' datetime DEFAULT '0000-00-00 00:00:00', 
    'expires_time' datetime DEFAULT '0000-00-00 00:00:00', 
    'renews' int(11) DEFAULT 0, 
    PRIMARY KEY ('id'), 
    KEY 'fk_post_id' ('post_id'), 
    CONSTRAINT 'fk_post_id' FOREIGN KEY ('post_id') REFERENCES 'posts'('id') 
    ENGINE=InnoDB DEFAULT CHARSET=latin1 
) 

我在得到什麼控制器功能完成後我的數據庫

id|post_id|user_id|is_locked|start_time|end_time|expires_time|renews 
1 | 999 | 32 | 1 | 2017-09-14 ... | 0000-00-00 ... | 2017-09-14 ... | 0 
2 | 999 | 32 | 0 | 2017-09-14 ... | 2017-09-14 ... | 2017-09-14 ... | 0 

我想在我的數據庫控制功能後,什麼結束

id|post_id|user_id|is_locked|start_time|end_time|expires_time|renews 
1 | 999 | 32 | 0 | 2017-09-14 ... | 2017-09-14 ... | 2017-09-14 ... | 0 

與這兩個is_locked和END_TIME更新,而不是一個新行

+0

檢查您的實體是否爲dirty(),如果沒有使用setDirty()將一個字段標記爲髒。 Table :: save()不會保存實體,因爲它看起來沒有變化。 – burzum

+0

所以我在場上設置了髒標誌。在我的調試日誌中,我可以看到isNew()== false和dirty == true,但是我仍然將單獨的行插入表中,而不是更新。 – user2860682

+0

嘿,只是好奇,如果我的答案有所幫助,或者如果你仍然需要幫助。 – KaffineAddict

回答

1

你的主鍵被列爲ID和你不設置那個地方看起來不像。如果您的主鍵不匹配,您將無法更新記錄。爲什麼不做類似的事情。

$editLock = editLockTable->findByUserIdAndPostId($userId, $postId); 
if($editLock == null) { $editLock = newEntity($userId, $postId); } 

更好的是,你可以做一個findOrCreate調用以及讓你在一次調用中處理這兩種情況。如果找不到記錄,findOrCreate將創建一個具有指定條件的實體。

相關問題