Каскадное удаление в наследовании таблиц классов не удаляет родительскую строку - PullRequest
2 голосов
/ 06 апреля 2020

У меня есть родительский класс с именем Notification, у которого CommentNotification является одним из его дочерних элементов (наследование таблиц классов).

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

В CommentNotification я включил onDelete = "CASCADE", чтобы при удалении комментария также было удалено прикрепленное к нему уведомление.

/**
     * @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;
    ...
}

По запросу я также показываю ContentItemComment. Это не содержит двунаправленной связи с 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;
...
}

Однако он успешно удаляет строку в comment_notification, но строка в notification все еще существует, оставляя меня с призрачными записями в таблице уведомлений, которые Мне приходится каждый раз вручную удалять.

Например, этот запрос будет каждый день возвращать новые результаты:

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

Я пропустил аннотацию в Notification?

1 Ответ

2 голосов
/ 09 апреля 2020

На Doctrine сайте есть следующее примечание:

Если вы не используете SchemaTool для генерации необходимого SQL, вы должны знать, что удаление класса В наследовании таблиц используется свойство внешнего ключа ON DELETE CASCADE во всех реализациях базы данных. Невозможность реализовать это самостоятельно приведет к мертвым строкам в базе данных.

Это возможная причина?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...