2012-02-12 62 views
1

这是关于CakePHP的一个相当基本的问题,但是由于我对这个框架的知识相当生疏,这让我失去了很多时间。在CakePHP中使用相关模型

我在GuestPresent之间有一个ManyToMany关系。无论何时创建新访客并与礼物相关联,我都希望将礼物标记为已采用。如果现在已经被采用,则会出现一些错误。我之所以不只是宣称嘉宾有许多礼物,是因为将来事情可能会改变,并且不止一位嘉宾可能会与某个礼物相关联,所以我更愿意避免Db迁移。

我的Guest::add()动作如下所示。它用一个POST来调用一个新的Guest的数据和一个存在的Present的id。

public function add() { 
    if ($this->request->is('post')) { 
     $id = $this->request->data['Present']['id']; 
     $this->Guest->create(); 
     $present = $this->Guest->Present->findById($id); 
     if ($present['Present']['taken']) { 
      throw new ForbiddenException(); 
     } 

     if ($this->Guest->save($this->request->data)) { 
      if ($this->Guest->Present->saveField('taken', true)) { 
       // Give the guest a uuid and proceed with a welcome message 
       $this->Guest->read(); 
       $this->set('uuid', $this->Guest->data['Guest']['uuid']); 
      } 
     } 

    } 
    else { 
     throw new ForbiddenException(); 
    } 
} 

会发生什么情况是,一个新的客户创建(正确的),并与鉴于目前的(正确的),但是当我保存taken场创建而不是修改给出一个新的存在有关。

什么是继续更新当前存在的正确方法?

如果它的任何帮助,我使用CakePHP 2.0

回答

2

对于由主键,最好使用登此外read方法获得的模型数据:

$present = $this->Guest->Present->read(null, $id); 

读法设置模型的id属性,以便对其他方法的进一步调用会影响相同的数据记录,而不是创建新的方法。这应该可以解决您遇到的问题。

Model callbacks倾向于更适合这些情况。您可以将一个beforeSave回调添加到Guest类以检查是否已经存在,并且如果是,则不允许创建。这样模型逻辑就留在了模型层,你不需要做任何额外的工作,例如如果在保存现有的Guests时必须强制约束,或者从不同的控制器或动作创建约束。

1

听起来你试图存储的模型ID正在丢失范围。您应该能够通过更新代码来解决您的问题:

... 
if ($this->Guest->save($this->request->data)) { 
    $this->Guest->Present->id = $id; 
    if ($this->Guest->Present->saveField('taken', true)) { 
...