gpt4 book ai didi

CakePHP - 在 Model->beforeSave() 中从插入更改为更新

转载 作者:行者123 更新时间:2023-12-02 10:25:05 27 4
gpt4 key购买 nike

这是我的 beforeSave 函数。 checkExisting() 检查 $this->data 中的某些字段是否唯一,如果不存在则返回 false,如果存在则返回现有记录的 ID。该功能运行良好。

    public function beforeSave(){
if ($this->checkExisting() !== false){
$this->id = $this->checkExisting();
}
return true;
}

我认为我的代码应该做的是:如果存在现有记录,则将 Model->id 设置为该现有记录的 ID,从而强制 CakePHP 更新而不是插入。

无论如何,这段代码实际上所做的是插入一条新记录。

如果我更改 $this->id = $this->checkExisting();到 $this->data['Model']['id'] = $this->checkExisting();,MySQL 给出一个错误(主键的值重复),因为 Cake 仍在尝试插入,而不是更新,数据。

Cake 在什么阶段决定进行插入而不是更新? beforeSave() 是否太晚而无法影响此决定?

编辑 - 这是我的 Controller 代码:

public function add(){
if (!empty($this->data)){
$saved = 0;
foreach($this->data['Attendance'] as $att){
$this->Attendance->create();
if ($this->Attendance->save(array('Attendance'=>$att))){
$saved++;
}
if ($saved > 0){
$this->Session->setFlash('Data saved successfully','success');
}else{
$this->Session->setFlash('No data was saved. Please make sure you have entered some data.','failure');
}
}
}
}

想一想,是不是和我显式调用Attendance::create()有关?

最佳答案

不,beforeSave 改变这一点还不算太晚。 Model->save() 按顺序执行以下操作:

  1. 调用 Model->set(),传递提供的数据。这会提取一个 id 并设置 Model->id
  2. 调用回调函数(包括beforeSave())
  3. 根据设置的Model->id决定更新还是插入

假设 checkExisting() 行为正确,上面的代码应该可以工作。我会再看一下您的 checkExisting() 代码。

另请注意,您的代码在两次调用 checkExisting() 时效率很低。这样会更好:

$existing = $this->checkExisting();
if($existing) {
$this->id = $existing;
}

编辑我猜您已经创建了 checkExisting() ,因为如果其中一条记录无效,上面的 add() 操作最终会保存部分记录集。您应该使用 saveAll(),它可以在保存任何记录之前验证所有记录。

public function add() {
if(!empty($this->data)) {
if($this->Attendance->saveAll($this->data)) {
$this->Session->setFlash('Data saved successfully','success');
} else {
$this->Session->setFlash('No data was saved. Please make sure you have entered some data.','failure');
}
}
}

关于CakePHP - 在 Model->beforeSave() 中从插入更改为更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5719979/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com