使用 OneToMany 和 OneToOne 时,Doctrine 级联删除失败
Doctrine cascade removing fails with OneToMany and OneToOne
在过去的几天里,我一直在努力解决一个使用 Doctrine 进行级联删除的简单案例。
Doctrine 和 Symfony 是最新的。
我有两个实体 Serie 和 Asset,它们通过两个关系 OneToOne 和 OneToMany 相互链接。
架构完全像这样:
一个系列有很多资产。 (内容).
Serie 可以有一个 Asset。 (预览,此字段可为空)。
然而,无论我如何尝试编写和重写注释,我总是以这个错误结束:
An exception occurred while executing 'DELETE FROM serie WHERE id = ?' with params [1]:
SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or
update a parent row: a foreign key constraint fails
(galanthis
.asset
, CONSTRAINT FK_2AF5A5CAA3A9334
FOREIGN KEY
(serie
) REFERENCES serie
(id
))
当然,如果我在下面的代码中删除 "preview" 字段及其注释,问题就会消失:
/**
* 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
*
* @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;
这让我抓狂,只是一些简单的关系...是否有错误我再也看不到了,或者我需要使用解决方法吗?
我的猜测是在资产实体中的ManyToOne关系上设置级联={"remove"}而不是另一种方式。这样,当您删除链接到许多资产的系列时,它会告诉 Doctrine 该怎么做。
在过去的几天里,我一直在努力解决一个使用 Doctrine 进行级联删除的简单案例。 Doctrine 和 Symfony 是最新的。 我有两个实体 Serie 和 Asset,它们通过两个关系 OneToOne 和 OneToMany 相互链接。
架构完全像这样:
一个系列有很多资产。 (内容).
Serie 可以有一个 Asset。 (预览,此字段可为空)。
然而,无论我如何尝试编写和重写注释,我总是以这个错误结束:
An exception occurred while executing 'DELETE FROM serie WHERE id = ?' with params [1]:
SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (
galanthis
.asset
, CONSTRAINTFK_2AF5A5CAA3A9334
FOREIGN KEY (serie
) REFERENCESserie
(id
))
当然,如果我在下面的代码中删除 "preview" 字段及其注释,问题就会消失:
/**
* 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
*
* @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;
这让我抓狂,只是一些简单的关系...是否有错误我再也看不到了,或者我需要使用解决方法吗?
我的猜测是在资产实体中的ManyToOne关系上设置级联={"remove"}而不是另一种方式。这样,当您删除链接到许多资产的系列时,它会告诉 Doctrine 该怎么做。