学说级联删除失败,一对多和OneToOne(Doctrine cascade removing fa

2019-10-23 21:52发布

我一直在挣扎了过去几天的级联使用Doctrine取出的简单情况。 教义和Symfony的是最新的。 我有两个实体意甲和资产由两个关系OneToOne和一对多相互链接。

该模式正是这样的:

意甲有很多资产。 (内容)。

意甲能有一个资产。 (预览,则此字段可为空)。

但是,不管我如何努力编写和改写的注释,我总是最后与此错误:

在执行时发生异常“DELETE FROM WHERE意甲ID =? 使用参数[1]:

SQLSTATE [23000]:完整性约束违规:1451无法删除或更新父行,外键约束失败( galanthisasset ,约束FK_2AF5A5CAA3A9334外键( serie )参考serieid ))

当然,问题消失,如果我删除了“预览”字段和其下面的代码注释:

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

它的驾驶我疯了,这只是一些简单的关系......有没有搞错,我没有看到了,或者我需要使用一个解决方法吗?

Answer 1:

我的猜测是设置级联= {“删除”}在资产实体多对一的关系 ,而不是周围的其他方式。 这样一来,它告诉学说,当你删除链接到许多资产意甲做什么。



文章来源: Doctrine cascade removing fails with OneToMany and OneToOne