2010-10-24 112 views
2

我試圖用CakePHP構建一個邀請系統。我有邀請模式有許多人,而人有一個並且屬於邀請。我相信這些關係正在發揮作用,因爲我的邀請索引視圖可以通過邀請模式正確訪問並顯示其關聯的人員。但繼承人什麼關係規則是這樣的:用saveAll()保存多個模型CakePHP

class Invitation extends AppModel { 

    var $name = 'Invitation'; 
    var $hasMany = array(
     'People' => array(
      'className' => 'Person', 
      'foreignKey' => 'invitation_id', 
      'dependent'=> true 
     ) 
    ); 

    ... 
} 

class Person extends AppModel { 

    var $name = 'Person'; 
    var $hasOne = 'Invitation'; 
    var $belongsTo = 'Invitation'; 

    ... 
} 

更新的模型關係:

class Invitation extends AppModel { 

    var $name = 'Invitation'; 
    var $hasMany = array('Person'); 

    ... 
} 

class Person extends AppModel { 

    var $name = 'Person'; 
    var $belongsTo = array('Invitation'); 

    ... 
} 

在我的邀請加入的功能,但是,我有保存爲新人們該數據的麻煩。我想同時添加一個邀請和兩個人。

我的繼承人附加功能:

function add() { 

     $this->autoRender = false; 

     if($this->RequestHandler->isAjax()) { 

      $this->layout = 'ajax'; 

      if(!empty($this->data)) { 

       $this->Invitation->create(); 

      if($this->Invitation->saveAll($this->data)) { 

        //debug($this->data);  

        $this->Session->setFlash('Saved'); 
        $this->redirect('invitations/add_invitations'); 

       } else { 

        echo('Didnt save<br />'); 

       } 

     } 
     } 

} 

這裏是我的調試($這個 - >數據)的輸出:

Array 
(
    [Invitation] => Array 
     (
      [code] => 001 
      [password] => 85c8a3735499bf91d25e5960ab4ed9deeb0b457e 
      [type] => 1 
      [num_people] => 2 
     ) 

    [Person] => Array 
     (
      [0] => Array 
       (
        [fname] => Jane 
        [lname] => Doe 

       ) 

      [1] => Array 
       (
        [fname] => John 
        [lname] => Doe 
       ) 

     ) 

) 

我沒有得到任何錯誤。邀請數據保存正確,但人員沒有。

更新:我終於得到了與上述更新的模型關係工作。顯然hasOne & belongsTo Person模型中的規則是衝突的。之後,我犯了一個錯誤(令人尷尬的),這是防止保存到相關的Person模型:

在邀請模式中,我hade $ hasMany = array('People');當它應該是$ hasMany = array('Person')。

我還必須更改我的數據庫的配置以使用InnoDB作爲默認值,所以這肯定是一個必要的修復。

+0

我想你的人沒有通過驗證測試。你有'人桌'嗎? – bancer 2010-10-25 00:55:18

+0

保存操作後,嘗試調試($ this-> Invitation-> invalidFields())'。 – deceze 2010-10-25 02:36:20

+0

我當然有一個「people」表,帶有一個invitation_id字段。如上所述調試會輸出一個空數組,因此我假設這意味着數據已經過驗證。 – 2010-10-26 16:31:21

回答

1
var $hasOne = 'Invitation'; 
var $belongsTo = 'Invitation'; 

這些關係到相同型號應該有不同的別名,否則蛋糕會感到困惑,因爲我沒有試圖拆開它。見http://book.cakephp.org/view/1046/Multiple-relations-to-the-same-model

+0

有趣。在仔細研究關係類型之後,我刪除了「Person hasOne Invitation」規則,現在只有「Person belongsTo Invitation」,因爲這裏只有一個關係。我在邀請模式中嘗試了這種方式,沒有關係規則,以及「邀請擁有多個人」,並且兩種情況都得到了相同的結果:邀請數據已保存,人員數據未保存。 – 2010-10-26 16:34:59

+0

另外...我試着分開模型保存,並使用$ this-> Invitation-> Person-> saveAll($ this-> data ['Person']),這給了我一個錯誤:undefined property Invitation :: $ Person ...或者這個效果的東西。這似乎表明關係沒有正確定義,因爲Person在邀請中不可用。 – 2010-10-26 16:38:14

+0

從關於saveAll()的書中:「atomic:如果爲true(默認值),將嘗試保存單個事務中的所有記錄,如果數據庫/表不支持事務,則設置爲false。類似於傳入的$ data數組,但取決於每條記錄是否成功保存,值被設置爲true/false。還要看看這個 - 你可能沒有使用事務引擎:「http://dev.mysql.com /doc/refman/5.0/en/ansi-diff-transactions.html – Leo 2010-10-26 16:47:43