Последние несколько дней я боролся за простой случай удаления каскада с помощью Doctrine. Доктрина и Симфония обновлены. У меня есть две сущности Serie и Asset, которые связаны друг с другом двумя отношениями OneToOne и OneToMany.
Схема такова:
У серии есть много Активов. (Содержание).
У серии может быть Asset. (предварительный просмотр, это поле имеет значение NULL).
Однако, как бы я ни старался писать и переписывать аннотации, я ВСЕГДА получаю эту ошибку:
Исключение произошло при выполнении команды «УДАЛИТЬ ИЗ СЕРИИ WHERE id =?» с параметрами [1]:
SQLSTATE [23000]: нарушение ограничения целостности: 1451 Не удается удалить или обновить родительскую строку: ограничение внешнего ключа завершается неудачно (
galanthis
.asset
, CONSTRAINTFK_2AF5A5CAA3A9334
FOREIGN KEY (serie
) ССЫЛКИserie
(id
))
Конечно, проблема исчезает, если я удалю поле предварительного просмотра и его аннотации в следующем коде:
/** * Serie * * @ORM\Table(name="serie") * @ORM\Entity(repositoryClass="Gedmo\Sortable\Entity\Repository\SortableRepository") * @ORM\HasLifecycleCallbacks */ class Serie { /** * @var integer * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ private $id; /** * @var string * * @ORM\Column(name="title", type="string", length=96) */ private $title; /** * @var integer * * @Gedmo\SortablePosition * @ORM\Column(name="position", type="integer", nullable=true) */ private $position; /** * @var \Portfolio * * @ORM\ManyToOne(targetEntity="Portfolio", inversedBy="series") * @ORM\JoinColumns({ * @ORM\JoinColumn(name="portfolio", referencedColumnName="id") * }) */ private $portfolio; /** * @var \Asset * * @ORM\OneToOne(targetEntity="Asset") * @ORM\JoinColumns({ * @ORM\JoinColumn(name="preview", referencedColumnName="id", nullable=true, onDelete="SET NULL") * }) */ private $preview; /** * @var \Doctrine\Common\Collections\Collection * * @ORM\OneToMany(targetEntity="Asset", mappedBy="serie", cascade={"remove"}) **/ private $assets;
Вот код для объекта Asset:
/** * Asset * * @ORM\Table(name="asset") * @ORM\Entity(repositoryClass="Gedmo\Sortable\Entity\Repository\SortableRepository") * @ORM\HasLifecycleCallbacks * @ORM\InheritanceType("SINGLE_TABLE") * @ORM\DiscriminatorColumn(name="asset", type="string") * @ORM\DiscriminatorMap({"asset" = "Asset", "video" = "Video","image" = "Image"}) * */ class Asset { /** * @var integer * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; /** * @var string * * @ORM\Column(name="path", type="string", length=128) */ protected $path; /** * @var string * * @ORM\Column(name="filename", type="string", length=64) */ protected $filename; /** * @var integer * * @ORM\Column(name="position", type="integer", nullable=true) * @Gedmo\SortablePosition */ protected $position; /** * @var string * * @ORM\Column(name="description", type="string", length=255, nullable=true) */ protected $description; /** * @var string * * @ORM\Column(name="mime", type="string", length=16, nullable=true) */ protected $mime; /** * @var \Serie * * @ORM\ManyToOne(targetEntity="Serie", inversedBy="assets") * @ORM\JoinColumns({ * @ORM\JoinColumn(name="serie", referencedColumnName="id") * }) */ protected $serie; /** * @var UploadedFile */ protected $file; /** * @var string */ protected $extension;
Это сводит меня с ума, это просто некоторые простые отношения … Есть ли ошибка, которую я больше не вижу, или мне нужно использовать обходной путь?