Puis-je ajouter une condition à CakePHP de l'instruction de mise à jour?
Car il ne semble pas y avoir de soutien pour le verrouillage optimiste dans CakePHP, je vais prendre un coup de couteau à la construction d'un comportement qui l'implémente. Après un peu de recherche dans les comportements, je pense que je pourrais exécuter une requête dans l'événement beforeSave pour vérifier que le champ version n'a pas changé.
Cependant, j'ai plutôt de mettre en œuvre le contrôle par la modification de l'instruction de mise à jour de la clause where de
WHERE id = ?
à
WHERE id = ? and version = ?
De cette façon, je n'ai pas à vous soucier d'autres demandes de modification de l'enregistrement de base de données entre le moment où j'ai lu la version et le temps que j'ai exécuter la mise à jour. Cela signifie aussi que je peux faire une base de données d'appel, au lieu de deux.
Je peux voir que la DboSource.update()
méthode prend en charge les conditions, mais Model.save()
ne se passe jamais de toutes les conditions.
Il semble que j'ai un couple d'options:
- Faire le check-in
beforeSave()
et vivre avec le fait que ce n'est pas l'épreuve des balles. - Hack ma copie locale de CakePHP pour vérifier un
conditions
clé dans laoptions
tableau deModel.save()
et le transmettre à laDboSource.update()
méthode.
Maintenant, je suis penché en faveur de la deuxième option, mais cela signifie que je ne peux pas partager mon comportement avec les autres utilisateurs, sauf si elles s'appliquent mon hack de leur cadre.
Ai-je raté une option plus facile?
OriginalL'auteur Don Kirkby | 2009-09-25
Vous devez vous connecter pour publier un commentaire.
Lors de l'utilisation de
save()
pour mettre à jour un enregistrement, le Gâteau s'attend à uneid
d'être présent et permettra de mettre à jour uniquement le rendu avec cetteid
.Ce que vous cherchez est
updateAll()
:Juste pour préciser, la save() de la commande utilise actuellement une condition par défaut que seulement correspond à l'id du champ. Je veux ajouter une deuxième condition qui assure également le numéro de version n'a pas changé à cause d'un autre utilisateur mise à jour de l'enregistrement de même.
OriginalL'auteur deceze
Je suis allé avec le piratage de ma copie locale de CakePHP. Je n'ai pas regardé récemment, pour voir si les versions les plus récentes de CakePHP offre une nouvelle option.
OriginalL'auteur Don Kirkby