cakephp 从旧数据值 + 新值保存更新数据

Posted

技术标签:

【中文标题】cakephp 从旧数据值 + 新值保存更新数据【英文标题】:cakephp save update data from old data value + new value 【发布时间】:2014-02-18 08:36:25 【问题描述】:

我不知道要搜索我的问题的关键字。如何保存已存在值的字段的更新数据,我想用附加值对其进行更新。

这是一个 cakephp 示例:

$userData = array(
      'id' => $userId,
      'credit' => $newCredit // This will update only new credit
);
$this->User->save($userData);

如果我使用普通查询 mysql 会是这样的:

mysql_query("UPDATE `users` SET `credit` = `credit` + '$newCredit' WHERE `id` = '$userId'");

您只能看到一次普通的 SQL Query 以使用credit 的现有数据进行更新。我知道我可以通过使用SELECT 这些数据并在php 中执行操作,然后返回UPDATE 数据,但这将是2 次(选择,然后更新)。

那么 cakephp 可以一下子搞定吗?以及如何:D?

【问题讨论】:

【参考方案1】:

updateAll 可以工作

$this->User->updateAll(
       array('credit' => "credit + $newCredit"),
       array('id' => $userId)
    );

【讨论】:

【参考方案2】:

试试这个......

   $user =  $this->User->read(null, $primary_key_id);
   $new_credit = $user['User']['credit'] + $add_new_value_of_credit;
   $this->User->id = $primary_key_id;
   $this->User->saveField('credit', $new_credit);

【讨论】:

我希望我在名为 credit 的字段中的旧数据更新为新信用,而不用新值替换旧值。 您只需要更新相应行的“信用”列吗? 是的,但我想要更新查询但不替换我的旧数据值。例如,我有信用 = 10,然后我还有另一个新信用 5 要更新,那么我的信用将是 15(不是5)。【参考方案3】:

试试这个:

$userData = array(
      'id' => $userId,
      'credit' => 'credit +'.$newCredit // old credit value + new credit value
);
$this->User->save($userData);

或者这个:

$newCredit = 566;
$this->User->read(null, $userId);
$this->User->set('credit',$this->User->field('credit') + $newCredit);
$this->User->save();

【讨论】:

不,它不起作用,错误出来了:SQLSTATE[HY000]: General error: 1366 Incorrect integer value: 'credit + 1' for column 'credit' at row 1。使用此 sql 日志:UPDATE users SET credit = 'credit + 5' WHERE id = '120'。因为'credit + '.$newCredit 将被转换为字符串 当你使用$this->User->read(null, $userId);时,表示选择查询已经被使用,然后更新数据。所以和我上面抱怨的一样-_- 那是行不通的,如果你让它工作调用 save 它将不是一个原子操作。

以上是关于cakephp 从旧数据值 + 新值保存更新数据的主要内容,如果未能解决你的问题,请参考以下文章

CakePHP 3 跨 2 个表保存关联数据

UITableViewCell detailTextLabel在为其分配新值时不会更新其文本

cakephp:使用保存方法,我想在数据没有变化时更新修改时间

CakePHP 3自定义验证:如何在编辑期间将新值与旧值进行比较?

核心数据:从旧数据库导入值

后台核心数据:使用单独的上下文和通知,但不使用新值更新数据库