在保存而不是插入时更新实体

时间:2017-09-14 16:45:14

标签: php cakephp cakephp-3.x

在我的代码中,我试图在调用控制器函数时创建一个锁实体。创建新实体后,我将其保存在数据库中。一旦控制器功能完成其余的逻辑,我就会在返回重定向之前更新锁实体。但是,当我更新实体然后再次保存时,它将始终插入新的数据库行而不是更新现有实体。

到目前为止我尝试过的事情。

  • 我打电话给$ entity-> isNew(false);
  • 我使用find()方法在更新前获取实体并保存
  • 在save()
  • 之前使用patchEntity方法

这两种方法都应该更新isNew()以发信号save()来更新条目而不是插入新条目,但是我总是将新行添加到数据库中。

这是相关代码。

这是我的控制器功能

中的逻辑
//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

这是我的Entity类中的逻辑

//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,而不是新行

1 个答案:

答案 0 :(得分:1)

您的主键被列为ID,并且您没有将其设置为任何不一样的地方。如果您的主键不匹配,您将无法更新记录。为什么不做类似的事。

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

更好的是,您还可以执行findOrCreate调用,以便在一次调用中处理这两种情况。如果找不到记录,findOrCreate将创建具有指定条件的实体。