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更新,而不是一個新行
檢查您的實體是否爲dirty(),如果沒有使用setDirty()將一個字段標記爲髒。 Table :: save()不會保存實體,因爲它看起來沒有變化。 – burzum
所以我在場上設置了髒標誌。在我的調試日誌中,我可以看到isNew()== false和dirty == true,但是我仍然將單獨的行插入表中,而不是更新。 – user2860682
嘿,只是好奇,如果我的答案有所幫助,或者如果你仍然需要幫助。 – KaffineAddict