2011-01-24 129 views
3

我那裏有五個字段一個相對簡單的輸入模式:當使用saveAll時,CakePHP的beforeSave不保留新數據?

  1. ID
  2. 型(該項是什麼數據類型)
  3. 量(多少是任何類型)
  4. 單元(該類型的單位)
  5. 日期(時輸入此項的datettime)
  6. USER_ID(誰進入
用戶的id

所以,沒有什麼幻想。現在一個表單可以有多個條目(已經存在的和新創建的),表單通過ajax調用進行擴展。

當我提交表單$this->data看起來是這樣的:

Array 
(
    [Entry] => Array 
     (
      [date] => 2011-01-07 
      [0] => Array 
       (
        [id] => 1 
        [type] => Eat 
        [amount] => 1 Steak, one baked potatoe 
        [unit] => lunch 
        [time] => Array 
         (
          [hour] => 13 
          [min] => 31 
         ) 

       ) 

      [1] => Array 
       (
        [type] => weight 
        [amount] => 78.5 
        [unit] => KG 
        [time] => Array 
         (
          [hour] => 22 
          [min] => 22 
         ) 

       ) 

     ) 

) 

$this->data['Entry']['date']的第一項是應當由所有條目中使用的日期。而且由於user_id缺失,我在入口模型中創建了「beforeSave」函數。它看起來像這樣:

function beforeSave() { 
    App::import('Component','Session'); 
    $this->Session = new SessionComponent(); 

    if (isset($this->data) && isset($this->data['Entry'])) { 
     $date = $this->data['Entry']['date']; 
     unset($this->data['Entry']['date']); 

     foreach ($this->data['Entry'] as $n => $entry) { 
      if (is_array($entry)) { 
      $this->data['Entry'][$n]['date'] = $date . ' ' . $entry['time']['hour'] . ':' . $entry['time']['min'] . ':00'; 
       $this->data['Entry'][$n]['user_id'] = $this->Session->read('Auth.User.id'); 
      } 
     } 
     debug($this->data); 

    } 
    return true; 
} 

我刪除的日期,與用戶的輸入時間一起添加它,從而創建MySQL日期時間錄入,並添加登錄的用戶的USER_ID。直截了當,真的。得到的陣列(如輸出由去年debug())如下所示:

Array 
(
    [Entry] => Array 
    (
     [0] => Array 
      (
       [id] => 1 
       [type] => Eat 
       [amount] => 1 Steak, 1 baked potatoe 
       [unit] => lunch 
       [time] => Array 
        (
         [hour] => 09 
         [min] => 31 
        ) 

       [date] => 2011-01-07 09:31:00 
       [user_id] => 2 
      ) 

     [1] => Array 
      (
       [type] => Weight 
       [amount] => 78.5 
       [unit] => KG 
       [time] => Array 
        (
         [hour] => 22 
         [min] => 22 
        ) 

       [date] => 2011-01-07 22:22:00 
       [user_id] => 2 
      ) 

    ) 

) 

因此,它看起來就像我希望它看起來它應該很容易保存。但是,當我使用$this->Entry->saveAll($this->data['Entry'])保存所有條目時,不僅無法正常工作,而且在saveAll後直接調試$this->data時,它看起來與saveAll函數之前完全相同 - 日期返回到數組中,條目不有一個日期或user_id條目。

我可以看到beforeSave叫,我可以看到它的變化$this->data,但beforeSave的結束和「白水」的使用我的所有更改會丟失和$this->data回覆到它的原始狀態之間的某處。因此不會發生儲蓄。

回答

6

我有類似的問題試圖通過hasMany實施一些消毒。事實證明,問題在於saveAll()如何工作。控制器中的$ this->數據與Model :: beforeSave()回調中的$ this-> data不同,並且兩者不同步。當您調用Model :: saveAll()從控制器傳遞$ this-> data時,您明確地將模型設置爲數據數組的「舊版本」。當你看看位於cake/lib /型號白水定義/ model.php少了點:

if (empty($data)) { 
    $data = $this->data 
} 

,並沒有更多的同步上漲的模式修改$ data數組和參數$數據傳遞形成控制器。解決方法是不傳遞數據到saveAll(),而是先使用Model :: set()在模型上設置數據,然後調用Model :: saveAll()(不帶$ data參數)。

+0

這不起作用,至少使用行爲...:_( – elboletaire 2014-01-23 12:27:48

0

據我所知白水()updateAll()和deleteAll()不默認

引發任何回調需要手動啓用它們(該方法的最後一個參數)

+0

不,回調被觸發得很好,因爲beforeSave函數中的調試顯示了新的數據結構。 – Sorcy 2011-03-14 08:19:27

0

你不在驗證中被絆倒了嗎?

嘗試

$this->Entry->saveAll($data,array('validate'=>false)); 

如果它工作,然後問題就出在驗證

但是不要忘了,你需要在沒有指定主鍵拯救單一車型之前,使用創建()。也許在saveAll()中混合新數據和現有數據是個問題。

+0

不是。這個模型沒有驗證。另外,因爲我將我的beforeSave函數移動到控制器中,所以它工作得很好。我沒有改變任何功能,但是當它在控制器中被調用時,數據結構被保留,當它在beforeSave中被調用時,它不是。 – Sorcy 2011-03-14 08:13:13

1

當我們調用SaveAll時,不會將更新/提交的數據傳遞給model的beforeSave。從這個問題出來,

創建模型tmp_data陣列

var $tmp_data = array(); 

白水電話,設置這個變量之前, 即

$this->model->tmp_data = $this->data; 
$this->model->saveAll(); 

然後,修改代碼model-> beforeSaveBefore 而不是$this->data use $this->tmp_data

相關問題