Bir alan bir düzenleme eylemi değiştirildi, CakePHP, nasıl belirleyebilirsiniz?

6 Cevap php

Ben ilgili alanlar için bir sayacı artırır CakePKP'deki cacheCounter, kullanıyorum.

Örneğin, ben bir kişi sofraya Kaynak tablo var. Person.source_id Kaynak tablodaki bir satıra eşler. Her kişi bir kaynağı vardır, ve her Kaynak yok ya da birçok kişi satır var.

Ben bir kişi üzerinde bir kaynağın değerini değiştirmek cacheCounter harika çalışıyor. Bu Source.Person_Count artırır. Serin.

Bu artışlarla zaman, o bir kişi için hedef kaynağına ekler, ama eski değeri onu kaldırmaz. Ben afterSave in () updateCacheControl çalıştı, ama o hiçbir şey yapmadı.

Öyleyse ben kaynak source_id çıkarmak istiyorum afterSave benim modelinde bazı kodlar yazdım, ama ben bile source_id değişen değildi bile zaman zaman bu yaptım. (Yani sayısı negatif gitti).

Benim soru: bir alan CakePKP'deki modelinde değiştirildi olmadığını anlamanın bir yolu var mı?

6 Cevap

Bir alandaki değişiklikleri izlemek için, başka yerde gerekli hiçbir değişiklik ile modelinde bu mantığı kullanabilirsiniz:

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;
}

Alexander Morland Yanıt referans ile.

Nasıl yerine filtreden önce o aracılığıyla döngü bu konuda.

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

Ayrıca anahtarı yanı sıra değerini alacak.

Düzenleme görünümünde, monitör ama soneki alan adını "_prev" gibi bir şey ile ve izlemek istediğiniz alanın mevcut değerine değerini ayarlamak istediğiniz alan için başka bir gizli alan bulunmaktadır. İki alanların eşit değilse Sonra denetleyicisinin düzenleme eylem, bir şey yapmak. örneğin

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

, Düzenlemeleri seyrek olur, böylece başka seçeneğini güncelleştirmeyi yapmadan önce kaydetmek önce, kaydı getir kaydedin, kaydettiğiniz önce db sizi getirilen verilerle düzenleme şeklinde sunulan verileri karşılaştırmak, hiçbir büyük anlaşma olduğunu, bu yüzden Farklı ise, bir şey yapmak.

"Kaydetmek", "etkilenen satırları" döndürür DBal çağrı çeşit kullanır görmek, genellikle bu son sorgu verileri değiştiğinde eğer hakim nasıl olduğunu, ya da olmasaydı. O olmasaydı, bir UPDATE ifadesinden sonra etkilenen satırlar 0 olduğundan.

Herhangi bir model sınıfında () getAffectedRows çağırabilirsiniz.

Sınıf Model Gönderen:

/**
 * 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();
    }