簡體   English   中英

主義級聯刪除失敗與OneToMany和OneToOne

[英]Doctrine cascade removing fails with OneToMany and OneToOne

在過去幾天中,我一直在努力嘗試使用Doctrine進行級聯刪除的簡單案例。 主義和Symfony是最新的。 我有兩個實體Serie和Asset,它們通過兩個關系OneToOne和OneToMany相互鏈接。

模式完全是這樣的:

意甲有很多資產。 (內容)。

意甲可以擁有資產。 (預覽,此字段為空)。

但是,無論我如何嘗試編寫和重寫注釋,我總是會遇到以下錯誤:

執行“從Serie 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實體的代碼:

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

它讓我發瘋,這只是一些簡單的關系...是否有我不再看到的錯誤,還是我需要使用解決方法?

我的猜測是在Asset實體中ManyToOne關系上設置cascade = {“ remove”}(而不是相反)。 這樣,它告訴Doctrine在刪除鏈接到許多資產的系列時該怎么做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM