In CakePHP, wie können Sie feststellen, ob ein Feld geändert wurde, eine Aktion Bearbeiten?

StackOverflow https://stackoverflow.com/questions/115665

  •  02-07-2019
  •  | 
  •  

Frage

Ich bin mit der cacheCounter in CakePHP, die erhöht einen Zähler für Verwandte Felder.

Beispiel, ich habe eine Tabelle Person eine Quelle Tabelle.Person.source_id Karten auf eine Zeile in der Quelltabelle.Jede person hat eine Quelle und jede Quelle hat keine oder vielen Menschen Reihen.

cacheCounter funktioniert Super, wenn ich den Wert einer Quelle auf eine person.Es erhöht Source.Person_Count.Cool.

Aber wenn es erhöht, es nimmt es auf die Ziel-Quelle für eine person, aber nicht entfernen Sie es von den alten Wert.Ich habe versucht updateCacheControl() in afterSave, aber das hat nichts tun.

Also dann ich schrieb einige code in meinem Modell für afterSave das würde subtrahieren Sie die Quelle source_id, aber es hat das immer so gemacht, auch wenn ich mich nicht sogar die änderung der source_id.(So der Graf ging negativ).

Meine Frage:Gibt es eine Möglichkeit zu sagen, ob ein Feld geändert wurde das Modell in CakePHP?

War es hilfreich?

Lösung

Die überwachung der änderungen in einem Feld verwenden, können Sie diese Logik in Ihrem Modell mit keine änderung anderswo erforderlich:

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

Andere Tipps

Mit Verweis auf Alexander Morland Antwort.

Wie wäre es mit diesem anstatt einer Schleife, die durch ihn vor dem filter.

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

Sie erhalten den Schlüssel als auch Wert auch.

In der Bearbeiten-Ansicht eine weitere versteckte Feld für das Feld, das Sie überwachen möchten, sondern suffix an den Namen des Feldes mit so etwas wie "_prev" und setzen Sie den Wert auf den aktuellen Wert des Feldes, das Sie überwachen möchten.Dann in Ihrer controller-Aktion Bearbeiten, tun etwas, wenn die beiden Felder nicht gleich sind.z.B.

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

Änderungen passieren nur selten, so ein anderes auswählen, bevor Sie das update ist keine große Sache, also, Holen Sie die Aufzeichnung, bevor Sie Sie speichern, speichern Sie es, vergleichen Sie die Daten in das edit-Formular mit den Daten, die Sie holte aus der db, bevor Sie Sie gespeichert haben, wenn Ihre verschiedenen, etwas zu tun.

Sehen Sie, wenn Sie die "speichern" setzt eine Art DBAL-Aufruf zurückgibt, die "betroffenen Zeilen", in der Regel diese ist, wie können Sie beurteilen, wenn die letzten Abfrage geändert, Daten, oder, wenn es das nicht.Denn wenn es nicht, die betroffenen Zeilen nach einer UPDATE-Anweisung 0 sind.

Sie können rufen Sie getAffectedRows() auf jedem Modell Klasse.

Von Klasse-Modell :

/**
 * 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();
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top