【问题标题】:CakePHP: Why am I unable to update record with set() or save()?CakePHP:为什么我无法使用 set() 或 save() 更新记录?
【发布时间】:2013-05-02 04:37:12
【问题描述】:

我整晚都在尝试更新这样的记录:

                $r = $this->Question->read(NULL, $question['Question']['id']);
                debug($r);// This is a complete Question array
                $this->Question->set('status', 'version');
                $s = $this->Question->save();
                //$s = $this->Question->save($r['Question']);//this also doesn't work
                debug($s); // = False every time!! Why??
                exit;

这两个 cmets 显示了我尝试过但也不起作用的变体。

@Dipesh:

                $this->data = $this->Question->read(NULL, $question['Question']['id']);
                $this->Question->status = 'version';
                $s = $this->Question->save($this->data);
                debug($s);
                exit;

@Dipesh II:

                $this->request->data = $this->Question->read(NULL, $question['Question']['id']);
                debug($this->data);
                //$this->Question->status = 'version';
                $this->request->data['Question']['status'] = 'version';
                $s = $this->Question->save($this->request->data);
                //$s = $this->Question->save($r['Question']);
                debug($s);
                exit;

@Dipesh 三世: (已删除)

【问题讨论】:

  • 您是否为问题设置了验证?如果是这样,你能在debug($s) 之后做一个debug($this->Question->validationErrors) 吗?
  • 这是个好主意。我不知道那个方法。但是你看到我下面的回答了吗?验证是否也适用于我的解决方案?
  • 是的,但我的猜测是您的解决方案正在运行,因为通过手动添加所有数据,您可能会正确验证并因此保存问题。在您的问题中发布您的模型,让我们看看我们有什么:)

标签: php cakephp cakephp-2.0 cakephp-2.1


【解决方案1】:

cakePHP 在Models::set()Controller::set(); 中都提供了一个名为 set() 的方法

关于Controller::set() 此方法用于从任何控制器方法设置视图级别的变量。例如从模型中获取记录并将它们设置为视图以将其显示给客户端,如下所示

$data = $this->{ModelName}->find('first');
$this->set('dataForView',$data) // now you can access $data in your view as $dataForView

关于模型::set() 此方法用于在模型上设置数据,要传递的数组格式必须与 Model::save() 方法中使用的格式相同,即像这样

$dataFormModel = array('ModelName'=>array('col_name'=>$colValue));
$this->{ModelName}->set($dataForModel);

Model::set() 只接受这种格式的参数,设置成功后可以进行如下操作

  1. 像这样直接根据模型中指定的验证规则验证此数据

    $isValid = $this->ModelName->validate();

  2. 调用Model::save()保存/更新数据

【讨论】:

  • 谢谢。对于 Model::set(),我们如何告诉 Cake 我们想要更新哪条记录? WHERE... 是否需要另一个参数?
  • 像这样简单地设置模型 concerend 的 id $this->Model->id = $intVar
  • 所以先运行那个 id() 方法?在 set() 和 save() 之前?
  • id 不是方法它是模型的类属性
【解决方案2】:

使用$this->data 而不是$r

示例

$this->data = $this->Question->read(NULL, $question['Question']['id']);

$this->set 用于设置变量值并将其传递给视图,以便视图可以访问它,其中$this->data 表示要存储在数据库中的数据。

如果您使用的是 Cake 2.0,请将在 Cake 2.0 中只读的 $this->data 替换为 $this->request->data

【讨论】:

  • 这是我需要对代码进行的唯一更改吗?或者我也save($this->data)
  • @Emerson 替换 $this->Question->status = 'version';$this->data['Question']['status'] = 'version';
  • 它仍然返回 false,但也带有此警告:Notice (8): Indirect modification of overloaded property QuestionsController::$data has no effect [APP/Controller/QuestionsController.php, line 151]
  • @Emerson 哦,你正在使用 cakephp2 然后使用 $this->request->data
  • 没有理由使用$this->request->data 代替局部变量。如果您想将数据传播到编辑表单,您将只使用$this->request->data然而当在同一个模型上使用多个save()调用时,总是使用Model::create()来重置模型并准备好执行下一个save()
【解决方案3】:

这不是很“自动”,但我能够像这样工作:

$set_perm_id = 42;//who cares
$data = array(
            'Question'=> array(
                        'id'=> $question['Question']['id'],
                        'perm_id'=> $set_perm_id,
                        'status'=>'version'
                        )
            );
$s=$this->Question->save($data);

基本上我只是手动构建数据数组。如果有人知道为什么这行得通,而不是我以前做的,我很想听听。

【讨论】:

    【解决方案4】:

    试试这些线..

    $this->Question->id =  $question['Question']['id'];
    $this->Question->set('status','version');
    $this->Question->save();
    

    $aUpdate["id"] = $question['Question']['id'];
    $aUpdate["status"] = "version";
    $this->Question->save($aUpdate);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-05
      • 1970-01-01
      • 1970-01-01
      • 2016-12-20
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多