2012-02-12 83 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)) { 
...