2013-03-27 90 views
-2

我已經遇到了保存蛋糕php中的數據的問題。cakephp爲相關模型的相關模型保存數據(而不是打印錯誤)

這裏是模型/關係。

  • 的hasMany 部門
  • 的hasMany

我在其中我允許用戶創建多個用於創建新的分區,視圖新的部門。在創建每個部門時,用戶可以爲該部門創建多個組。現在麻煩是我不確定如何保存組數據。

爲即時創建的每個部門,即時通訊使用多重索引方法輸入(即「Department.0.name」,Department.0.type),所以這將是一個簡單的使用saveAll方法。但是,對於創建的每個組,我需要一個department_id,並且由於沒有任何區的部門尚未保存,所以他們沒有ID。我怎樣才能保存這個新區的數據,保存新的部門,以及他們相關的新創建的組?有沒有一種方法可以解決創建適當關聯的組輸入的名稱屬性,比如「Department.0.Group.0.name」?

在此先感謝!如果有什麼不清楚的地方,請不要猶豫,我會很樂意再重述。

回答

2

你的POST數據數組是什麼樣的?

<?php 

debug($this->data); 

?> 

如果不正確的格式,相關車型將不會得到保存..蛋糕知道搶已尚未保存的車型「lastInsertId()」,所以你不要不必擔心那些......我不確定的是,這些文檔並沒有真正涉及,這個節省有多深。提供的示例如下:

$this->data = 
Array 
(
    [Article] => Array 
     (
      [title] => My first article 
     ) 
    [Comment] => Array 
     (
      [0] => Array 
       (
        [comment] => Comment 1 
        [user_id] => 1 
       ) 
      [1] => Array 
       (
        [comment] => Comment 2 
        [user_id] => 2 
       ) 
     ) 
) 

$this->Article->saveAll($this->data); 

這是保存「的hasMany」關係的關聯模型的正確結構(CakePHP的1.3),但我不知道,如果去任何更深比一個孩子。

我想到的一件事就是根據上面的格式構建數組,但將父模型留出。然後手動保存父模型數據,獲取:: getLastInsertId();然後對部門和團體進行saveAll。


[UPDATE] 我只是測試你的理論,它會工作你想讓你的方式。

<?php 

echo $this->Form->input('Department.0.Group.0.name'); 

?> 

會產生:

<input name="data[Department][0][Group][0][name]" type="text" id="Department0Group0name"> 

[更新2] 我做了一些在LIB /蛋糕/型號/ Model.php探索和發現這一點:

<?php 
... 

public function saveAssociated($data = null, $options = array()) { 
    ... 
    ... // code omitted. 
    ... 
    if ($options['deep']) { // This will recurse infinitely through all associations 
     $saved = $this->{$association}->saveAssociated($values, array_merge($options, array('atomic' => false))); 
    } 
    ... 
    ... 
    ... // code omitted. 
... 
?> 
+0

謝謝!至於saveAll,據我瞭解,它將保存模型數據和相關的模型數據。所以,在上述情況下,它可以節省所有這些。 saveAll是幾個保存方法的包裝,其中一個是saveAssociated()。就深度而言,爲了保存關聯模型相關模型的數據,我相信你可以使用saveAssociated($ data,array('deep'=> true))。我在區域行動的視圖內手動創建組的輸入。我可以將name屬性設置爲'',我想知道嗎? – Todd 2013-03-27 02:56:20

+0

這似乎是正確的,'深'=>真的吧?我從來沒有用過,好主意。我相信你的輸入名稱是有效的,我相信它會創建正確的結構。 '<?php echo $ this-> Form-> input('Modelname.0.fieldname'); echo $ this-> Form-> input('Modelname.1.fieldname'); ?> > – 2013-03-27 03:07:56

+1

實體深度限制 '在1.2中,有5個嵌套密鑰的硬限制。這在某些情況下對錶單輸入創建造成了很大的限制。在1.3中,現在可以創建無限嵌套的表單元素鍵。驗證錯誤和值讀取的任意深度也已添加.'看起來像限制是無限的:) – 2013-03-27 03:08:15