insérez ignorer sur les entrées en double dans Doctrine2/Symfony2
Comment ignorer sur les entrées en double à l'aide de Doctrine2?
Exemple d'erreur:
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'symfony' for key 'UNIQ_389B783389B783'
- Vous pouvez faire ce que propulser à faire: faire une méthode comme findByKeyOrCreate(), qui retourne un existant entité si tout ou en créer un nouveau si ce n'.
- Supprimer
@Unique
indice de ce domaine, si vous n'en avez pas besoin. - Évidemment, j'en ai besoin...
- Quels résultats attendez-vous de cela, lorsque vous essayez de sauver non-entrée unique?
- Il enregistre les données unique
Vous devez vous connecter pour publier un commentaire.
C'est l'une des nuisances de la Doctrine, il n'est pas possible de faire INSÉRER/mettre à JOUR l'Ignorer, il y a solution de contournement, comme la création d'une méthode qui vérifie si la ligne existe, et si c'est le cas alors il suffit de sauter.
Vous pouvez intercepter l'exception, de sorte que votre script n'est pas une exception. Toutefois, le gestionnaire de l'entité sera fermé et vous ne pourrez plus l'utiliser. Vous pouvez toujours utiliser PDO, et si vous pouvez insérer un enregistrement dans la base de données indiquant que le lot a échoué car
X
et il a besoin d'être redémarré (c'est ce que je fais d'habitude).Si aucune des options ci-dessus ne fonctionne pour vous, en fin de compte j'arrive à la fin de l'écriture de raw SQL pour effectuer des traitements par lots et je n'utilise pas de Doctrine à tous, il finit par être plus rapide et la capacité de faire INSÉRER/mettre à JOUR les Ignorer en fait une évidence.
Dans Symfony 3 vous pouvez réinitialiser le gestionnaire et continuer à travailler avec elle en appelant
resetManager()
méthode deDoctrine
objet après la capture deUniqueConstraintViolationException
exception.Voici un exemple:
composer require symfony/proxy-manager-bridge
Vous pouvez toujours attraper l'exception et ensuite l'ignorer. Juste être conscient que lorsque l'entité gestionnaire soulève une exception, le gestionnaire de l'entité ne peut plus être utilisé au cours de cette demande.