Dans CakePHP, comment pouvez-vous déterminer si un champ a été modifié lors d'une action d'édition?

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

  •  02-07-2019
  •  | 
  •  

Question

J'utilise le cacheCounter dans CakePHP , qui incrémente un compteur pour les champs associés.

Exemple, j'ai une table Person une table Source. Person.source_id correspond à une ligne de la table source. Chaque personne a une source et chaque source n’a pas ou plusieurs lignes Personne.

cacheCounter fonctionne correctement lorsque je modifie la valeur d'une source sur une personne. Il incrémente Source.Person_Count . Cool.

Mais lorsqu'il incrémente, il l'ajoute à la source de destination d'une personne, mais ne le supprime pas de l'ancienne valeur. J'ai essayé updateCacheControl () dans afterSave , mais cela n'a rien fait.

Alors, j’ai écrit dans mon modèle du code pour afterSave qui soustrait le code source ID_source, mais le faisait toujours même lorsque je ne changeais même pas le codes_source . . (Le compte est donc devenu négatif).

Ma question: Existe-t-il un moyen de savoir si un champ a été modifié dans le modèle dans CakePHP ?

Était-ce utile?

La solution

Pour surveiller les modifications apportées à un champ, vous pouvez utiliser cette logique dans votre modèle. Aucune modification n'est requise ailleurs:

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

Autres conseils

En référence à la Alexander Morland réponse.

Que diriez-vous de cela au lieu de passer en boucle avant le filtre?

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

Vous obtiendrez aussi bien la clé que la valeur.

Dans la vue Edition, incluez un autre champ masqué pour le champ que vous souhaitez surveiller, mais complétez le nom du champ par un suffixe du type " _prev " et définissez la valeur sur la valeur actuelle du champ que vous souhaitez surveiller. Ensuite, dans l'action d'édition de votre contrôleur, faites quelque chose si les deux champs ne sont pas égaux. par exemple

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

Les modifications arrivent rarement, aussi une autre sélection avant de faire la mise à jour n'est pas grave, donc, récupérez l'enregistrement avant de sauvegarder, sauvegardez-le, comparez les données soumises dans le formulaire de modification avec les données que vous avez extraites de la base de données avant vous. enregistré, si c'est différent, faire quelque chose.

Voir si le " save " utilise une sorte d’appel DBAL renvoyant les "lignes affectées", c’est généralement ainsi que vous pouvez déterminer si la dernière requête a modifié les données ou non. Sinon, les lignes affectées après une instruction UPDATE sont à 0.

Vous pouvez appeler getAffectedRows () sur n’importe quelle classe de modèle.

De la classe Modèle:

/**
 * 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();
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top