2 votes

La suppression en cascade dans l'héritage des tables de classe ne supprime pas la rangée parentale

J'ai une classe parent appelée Notification qui a CommentNotification comme l'un de ses enfants (héritage de la table des classes).

/**
 * This entity represents the notifications that are sent to users when an event happens
 * @ORM\Entity(repositoryClass="AppBundle\Repository\NotificationRepository")
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="type", type="string")
 * @ORM\DiscriminatorMap({
 *     "yp" = "YpNotification",
 *     "default" = "Notification",
 *     "comment" = "CommentNotification",
 *     "post" = "PostNotification"})
 * @ORM\Table(name="notification")
 */
class Notification
{
    /**
     * The identifier of this notification
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     * @var int $id
     */
    protected $id;
}

En CommentNotification J'ai inclus onDelete = "CASCADE" de sorte que, lorsque le commentaire est supprimé, la notification qui y était attachée est également supprimée.

/**
     * @ORM\Entity
     * @ORM\Table(name="comment_notification")
     * @ORM\Entity(repositoryClass="AppBundle\Entity\Notifications\CommentNotificationRepository")
     */  
class CommentNotification extends Notification
        {

            /**
             *
             * @ORM\ManyToOne(targetEntity="AppBundle\Entity\ContentItem\ContentItemComment")
             * @ORM\JoinColumn(name="comment_id", referencedColumnName="id", onDelete="CASCADE", nullable=false)
             */
            private $comment;
    ...
}

Sur demande, je montre aussi ContentItemComment. Il n'y a pas de relation bidirectionnelle avec CommentNotification.

/**
     * 
     * @ORM\Table(name="content_item_comment")
     * @ORM\Entity(repositoryClass="AppBundle\Entity\ContentItem\ContentItemCommentRepository")
     */
    class ContentItemComment
    {
        /**
         * @ORM\Column(type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        protected $id;
...
}

Cependant, il supprime avec succès la ligne dans le fichier comment_notification mais la ligne en notification existe toujours, ce qui me laisse des enregistrements fantômes dans la table de notification que je dois supprimer manuellement à chaque fois.

Par exemple, cette requête renverra de nouveaux résultats tous les jours :

SELECT * FROM `notification` n WHERE n.id not in (select id from comment_notification) and n.type='comment' 

Ai-je manqué une annotation dans Notification ?

2voto

craigh Points 564

Sur le Site de la Doctrine est la note suivante :

Si vous n'utilisez pas le SchemaTool pour générer le SQL requis, vous devez savoir que la suppression de l'héritage d'une table de classe fait appel à la propriété de clé étrangère ON DELETE CASCADE dans toutes les implémentations de base de données. Si vous n'implémentez pas cette propriété vous-même, des lignes mortes apparaîtront dans la base de données.

Est-ce la raison possible ?

1voto

Eugene Ruban Points 600

Donc, comme il a été mentionné dans les commentaires - si c'est une relation bidirectionnelle - vous devez ajouter orphanRemoval=true l'option relative aux OneToMany propriété.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X