为什么我的级联不起作用? - 完整性约束违反



我有父母和子女实体,父母是图像,孩子是对图像的投票

class Image {
    /**
     * @ORMId
     * @ORMColumn(type="integer")
     * @ORMGeneratedValue(strategy="AUTO")
     */
    protected $id;
    /**
     * @ORMColumn(type="string", length=255, name="file_name")
     * @var string $fileName
     */
    protected $fileName;
    /**
     * @ORMColumn(type="string", length=255, name="title", nullable=true)
     * @var string $title
     */
    protected $title = null;
    /**
     * @ORMColumn(type="string", length=255, name="author", nullable=true)
     * @var string $author
     */
    protected $author = null;
    /**
     * @ORMColumn(type="datetime", name="upload_at")
     */
    protected $uploadDate;
    /**
     * @ORMColumn(type="boolean", name="in_pool")
     */
    protected $inPool;
    /**
    * One image has many votes
    * @ORMOneToMany(targetEntity="Vote", mappedBy="image")
    */
    private $votes;

儿童:

class Vote
{
    /**
     * @ORMId
     * @ORMColumn(type="integer")
     * @ORMGeneratedValue(strategy="AUTO")
     */
    protected $id;
    /**
     * @ORMManyToOne(targetEntity="Image", inversedBy="votes")
     * @ORMJoinColumn(onDelete="CASCADE")
     */
    protected $image;
    /**
     * @ORMColumn(type="datetime", name="date")
     */
    protected $date;
    /**
     * This is internal variable, it does not have to be mapped into database field
     * @var int Counter of votes for an Image
     */
    private $counter;

您可以看到我在实体中设置了@ORMJoinColumn(onDelete="CASCADE")

但是,当我尝试删除有投票的图像时,我会得到这个:

执行"从image where id =?"执行"删除"时发生了例外。 使用参数[24]:

sqlstate [23000]:违反完整性约束:1451无法删除或 更新父行:外键约束失败(konkursvote, 约束FK_5A1085643DA5256D外键(image_id)参考 imageid))

用于删除基于ID的图像的代码如下:

/**
* @Route("/admin/removeimage/{id}", name="admin-remove-image")
*/
public function adminRemoveImage($id)
{
    $em = $this->getEm();
    $image = $em->getRepository('AppBundle:Image')->findOneById($id);
    $fileName = $image->getFileName();
    $em->remove($image);
    $em->flush();
    unlink('uploads/'.$fileName);
    unlink('media/cache/my_thumb/uploads/'.$fileName);
    return $this->redirectToRoute('admin-panel');
}

谁能告诉我为什么这种关系一直失败?

更新这是使用SHOW CREATE TABLE vote

的输出

|投票|创建表voteid int(11)不是null auto_increment, date dateTime而不是null, image_id int(11) 默认为null,主键(id),键IDX_5A1085643DA5256Dimage_id),约束FK_5A1085643DA5256D外键 (image_id)参考imageid))引擎= Innodb auto_increment = 14默认charset = utf8 caltrate = utf8_unicode_ci |

添加 @ORMJoinColumn(onDelete="CASCADE")是通过 doctrine:schema:updatedoctrine:schema:create来管理的表的映射。

除非发出上述命令,否则级联外键参考不会自动应用于数据库表列。

默认情况下,创建外键参考时,将其设置为ON DELETE RESTRICT

解决您的问题运行以下SQL命令:

ALTER TABLE `vote` DROP FOREIGN KEY `FK_5A1085643DA5256D`;
ALTER TABLE `vote` ADD CONSTRAINT `FK_5A1085643DA5256D` FOREIGN KEY (`image_id`) REFERENCES `image` (`id`) ON DELETE CASCADE;

将与运行相同:

php bin/console doctrine:schema:update --force

但是,模式更新可能会导致不可逆转的更改/损坏数据库结构。

请参阅:http://symfony.com/doc/current/doctrine.html#creating-the-database-tables-schema

我还建议运行php bin/console doctrine:schema:update --dump-sql来确定编辑学说实体映射的其他潜在错误配置。


另外,如@cerad所述,您可以通过使用 cascade={"remove"}这样的 CC_25来告诉学说在不依赖外键参考的情况下管理关系。

class Image 
{
    //...
    /**
    * One image has many votes
    * @ORMOneToMany(targetEntity="Vote", mappedBy="image", cascade={"remove"})
    */
    private $votes;
}

这将告诉Symfony删除Image实体关联的Vote实体集合的删除语句。

一个警告是,这仅在针对实体经理发出命令时起作用,而不是DBAL查询构建器。

参考:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/working-with-with-with-objects.html#removing-entities

相关内容

  • 没有找到相关文章

最新更新