2008-09-22 63 views
11

我在CakePHP中使用cacheCounter,它增加了相關字段的計數器。在CakePHP中,如何確定在編輯操作中字段是否發生了變化?

例如,我有一個人表一個源表。 Person.source_id映射到源表中的一行。每個人有一個來源,並且每個來源都沒有或多個人行。當我改變一個人源的價值

cacheCounter是偉大的工作。它增加Source.Person_Count。涼。

但是,當它增加時,它會將其添加到某個人的目標源,但不會將其從舊值中刪除。我在afterSave裏嘗試過updateCacheControl(),但那沒有做任何事情。

然後我在我的模型中編寫了一些代碼afterSave,它將減去源source_id,但即使我甚至沒有更改source_id,它也會這樣做。 (所以計數變爲負值)。

我的問題:有沒有辦法判斷一個字段在模型中CakePHP變化?

回答

17

爲了監視場的變化,你可以在模型中使用這個邏輯,沒有其它地方需要修改:

function beforeSave() { 
    $this->recursive = -1; 
    $this->old = $this->find(array($this->primaryKey => $this->id)); 
    if ($this->old){ 
     $changed_fields = array(); 
     foreach ($this->data[$this->alias] as $key =>$value) { 
      if ($this->old[$this->alias][$key] != $value) { 
       $changed_fields[] = $key; 
      } 
     } 
    } 
    // $changed_fields is an array of fields that changed 
    return true; 
} 
+0

我不清楚回調。這個功能不需要在控制器中調用嗎?我將如何實現這個? – 2012-04-13 17:01:34

-1

看看「保存」使用某種形式返回「受影響的行」,DBAL通話通常是,如果最後一個查詢變化的數據您如何判斷,或者如果它沒有。因爲如果沒有,一個UPDATE語句之後受影響的行是在此之前的更新是沒有什麼大不了的0

+0

謝謝。我實際上正在考慮如果值從編輯操作之前更改爲編輯操作之後,預存爲sql。 – Justin 2008-09-23 16:08:01

+0

我不確定我是否理解,你想避免SQL調用嗎? – Till 2008-09-23 17:30:41

0

編輯不常發生,所以另一個選擇,所以,你保存之前獲取該記錄,將其保存,將編輯表單中提交的數據與您在保存數據庫之前從數據庫中獲取的數據進行比較,如果其不同,則執行一些操作。

1

在編輯視圖中,爲要監視的字段添加另一個隱藏字段,但將字段名稱後綴加上「_prev」,並將該值設置爲要監視的字段的當前值。然後在您的控制器的編輯操作中,如果兩個字段不相等,請執行一些操作。例如

echo $form->input('field_to_monitor'); 
echo $form->hidden('field_to_monitor_prev', array('value'=>$form->value('field_to_monitor'))); 
+2

這不是一種非常安全的做事方式。任何有螢火蟲的人都可以改變_prev欄位的值。在我看來,最好與實際數據庫進行比較以檢查變化。看到我的回答 – 2008-10-01 06:33:30

-1

你可以叫getAffectedRows()上的任何模型類。

從類型號:

/** 
* Returns the number of rows affected by the last query 
* 
* @return int Number of rows 
* @access public 
*/ 
    function getAffectedRows() { 
     $db =& ConnectionManager::getDataSource($this->useDbConfig); 
     return $db->lastAffected(); 
    } 
7

參考亞歷山大莫蘭解答。

這是怎麼回事,而不是循環通過它在過濾器之前。

$result = array_diff_assoc($this->old[$this->alias],$this->data[$this->alias]); 

您將獲得關鍵以及價值也。

相關問題