J'utilise Propel 1 dans un projet assez important, et la version live utilise actuellement le comportement Archivable
. Ainsi, lorsqu'une ligne est supprimée, le comportement intercepte l'appel de façon transparente et déplace la ligne dans une table d'archivage. Cela fonctionne bien.Existe-t-il un moyen de combiner les comportements Archivable et Versionable dans Propel 1?
Je cherche à changer le fonctionnement de cette table afin que toutes les sauvegardes soient versionnées. Sur une branche de fonctionnalité, j'ai donc supprimé le Archivable
et ajouté le comportement Versionable
. Cela supprime la table générée automatiquement (table)_archive
et ajoute une table (table)_version
à la place.
Cependant, il est intéressant de noter que la table de version a un PK de (id, version)
avec une clé étrangère à la table en direct de id
à id
. Cela signifie que les versions ne peuvent pas exister sans une ligne live, ce qui n'est pas ce que je veux: je veux pouvoir supprimer une ligne et conserver les versions. Je pensais que ce comportement agirait comme Archivable
, c'est-à-dire que la méthode delete()
serait interceptée et modifiée à partir de son approche habituelle. Malheureusement, comme l'a confirmé par the documentation, cette méthode supprime la ligne en direct et toutes les versions précédentes:
void delete()
: Supprime l'historique de version d'objet
J'ai essayé le mélange à la fois Archivable
et Versionable
, mais cela semble pour générer du code qui se bloque dans l'API Query
: il essaie d'appeler une méthode archive()
qui n'existe pas. Je m'attends à ce que ce mélange de comportement n'ait jamais été conçu pour fonctionner (idéalement, il devrait être pris au moment de la construction du schéma, et peut-être que cela sera corrigé dans Propel 2).
Une solution consiste à essayer le comportement SoftDelete
au lieu de Archivable
- cela marque simplement les enregistrements comme supprimés plutôt que de les déplacer vers une autre table. Cependant, cela peut être problématique, car se joindre à une table avec ce comportement peut donner des comptes erronés pour les lignes non supprimées (et l'équipe Propel a décidé de la déprécier pour cette raison). Cela ressemble aussi à un trou de lapin que je ne veux pas descendre, car la quantité de refactoring peut devenir hors de contrôle.
Ainsi, il me reste à chercher une meilleure approche pour implémenter un système de versionnage qui ne supprime pas les anciennes versions lorsque la copie en direct est supprimée. Je peux le faire manuellement en intercepter les méthodes de sauvegarde et de suppression dans la classe du modèle, mais cela semble un gâchis quand Versionable
fait presque ce que je veux. Y a-t-il des paramètres pertinents que je peux modifier, ou y a-t-il de la valeur dans l'écriture d'un comportement personnalisé? Un rapide coup d'oeil sur le code de génération de modèles pour les comportements de base me donne envie de fuir le dernier!
Hi. Cela vous dérangerait-il de partager votre solution? – sanders