删除实体而不删除指向它的外键链接

时间:2016-03-17 22:00:46

标签: mysql sql symfony orm doctrine-orm

我有一个表产品实体 tva 是表 Tva 的链接,实体图像是链接到表媒体。我在sonata admin中渲染了网站的所有产品。我希望能够从管理中删除产品。

我希望能够删除产品而不删除指向它的外键链接。

但我有这个错误:

  

SQLSTATE [23000]:完整性约束违规:1451无法删除或   更新父行:外键约束失败(flypost,   CONSTRAINT FK_5A8A6C8D4D79775F FOREIGN KEY(tva_id)参考   tvaid))

这是我的实体tva和图像

/**
 * @ORM\ManyToOne(targetEntity="FLY\BookingsBundle\Entity\Tva", cascade={"persist", "remove"})
 * @ORM\JoinColumn(nullable=true)
 */

private $tva;

/**
 * @ORM\ManyToOne(targetEntity="FLY\BookingsBundle\Entity\Media", cascade={"persist","remove"})
 * @ORM\JoinColumn(nullable=true)
 */
private $image;

我决定将连接列从此* @ORM\JoinColumn(nullable=true)更改为此* @ORM\JoinColumn(onDelete="CASCADE"),它可以删除产品,但它也删除了外键,我不希望这样,因为我有其他使用相同图像和tva的产品。

2 个答案:

答案 0 :(得分:4)

删除父记录时,

(onDelete="CASCADE")将删除子记录。如果我们不想删除子记录,那么我们需要配置onDelete="SET NULL"。这会将外键值设置为子记录中的null

答案 1 :(得分:0)

我找到了解决问题的方法:)我删除了这一行:cascade={"persist","remove"}我将此行* @ORM\JoinColumn(nullable=true)更改为* @ORM\joinColumn(onDelete="SET NULL")

/**
 * @ORM\ManyToOne(targetEntity="FLY\BookingsBundle\Entity\Tva")
 * @ORM\joinColumn(onDelete="SET NULL")
 */
private $tva;

/**
 * @ORM\ManyToOne(targetEntity="FLY\BookingsBundle\Entity\Media")
 * @ORM\joinColumn(onDelete="SET NULL")
 */
private $image;

非常感谢@Darshan Mehta的帮助。 :)