【问题标题】:CakePHP Model::save() resets fields to default valuesCakePHP Model::save() 将字段重置为默认值
【发布时间】:2011-09-16 10:05:44
【问题描述】:

当我通过Model->save() 在 MySQL 数据库中保存(更新)字段时,如果我没有为设置了默认值的字段指定值,那么它会重置为默认值。

即使该字段已经存在值,也会这样做。

例如,考虑以下代码:

$existing_user = $this->CustomCart->User->field('id',array('User.email'=>$this->data['User']['email']));
if($existing_user)
{
    //update information
    $this->CustomCart->User->id = $existing_user;
}
$this->CustomCart->User->save($this->data);

在此代码中,它会检查是否已存在具有传递电子邮件地址的用户。如果是,则使用传递的信息更新该用户,否则创建一个新用户。

但是我在 users 表中有一个名为 role 的字段,默认值为 customer

$this->data 中没有为 role 设置值,因此在创建新用户时,role 会自动设置为 customer

但是,在更新现有用户时,即使他们有其他角色,例如“admin”,它仍然会将值重置为 customer

我不知道这是为什么。我没有专门设置的其他字段(没有默认值)保持它们的值。那么为什么会重置具有默认值的字段呢?

【问题讨论】:

    标签: cakephp model cakephp-1.3


    【解决方案1】:

    我有这个!您需要在保存前设置:

    $this->CustomCart->User->create(false);
    

    如果没有假,Cake 会以某种方式猜测模型应该是什么样子。

    【讨论】:

      【解决方案2】:

      我假设 field() 是您创建的一个函数,用于根据某些条件获取单个字段

      这段代码怎么样?:

      $existing_user = $this->CustomCart->User->field('id',array('User.email'=>$this->data['User']['email']));
      if($existing_user !== false){
          //update information
          $this->CustomCart->User->id = $existing_user;
          $this->data['User']['role'] = "admin";
      }
      $this->CustomCart->User->save($this->data);
      

      如果这段代码不能正常工作,我会很惊讶

      祝你好运!

      【讨论】:

      • 谢谢。实际上field() 是框架的一部分,但它确实做了你想做的事。此解决方案将解决我当前的问题,但是如果我将来添加更多默认字段,我将再次遇到相同的问题。我宁愿找到问题的根本原因,这样我不仅可以针对这种特殊情况修复它,而且确保它不会在未来其他地方开始发生。
      • 问题很简单,实际上并不是问题。您正在尝试从 CustomCart 控制器中保存用户,因此您必须设置 $this->data['User'].. 中的所有值。我的猜测是您没有正确构建 $this->data 变量.. 执行 @ 987654324@所以我们可以看到数据
      • 我没有指定$this->data['User']['role']。我为什么要? MySQL 默认值为 customer,这正是我希望 new 用户使用的值。但是,我希望现有用户的 role 保留他们已经设置的任何内容(adminteammamberunicorn 等.)。如果它已经设置,为什么要重置为 customer。这没有任何意义,也不是 MySQL 应该表现的方式。当您执行 UPDATE 时,您不必指定每个字段,只需指定您想要更改的字段。顺便说一句,我不是想在这里粗鲁,我只是认为我们不在同一个页面上。
      • 在这种情况下...查看执行更新的代码、pr($this->data) 和生成的查询会很有帮助。蛋糕总是将值重置为默认值是不正常的
      • @pleasedontbelong,Cake 通常只在出现错误时才显示生成的查询。你知道如何显示生成的查询吗?我进行了 Google 搜索,然后查找了 Model API,但没有看到任何相关信息。
      猜你喜欢
      • 2021-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-29
      • 1970-01-01
      • 1970-01-01
      • 2021-11-01
      • 2015-08-09
      相关资源
      最近更新 更多