gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 10:59:02 25 4
gpt4 key购买 nike

我有一个父实体和子实体,父实体是图像,子实体是对图像的投票

class Image {

/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(type="string", length=255, name="file_name")
* @var string $fileName
*/
protected $fileName;

/**
* @ORM\Column(type="string", length=255, name="title", nullable=true)
* @var string $title
*/
protected $title = null;

/**
* @ORM\Column(type="string", length=255, name="author", nullable=true)
* @var string $author
*/
protected $author = null;

/**
* @ORM\Column(type="datetime", name="upload_at")
*/
protected $uploadDate;

/**
* @ORM\Column(type="boolean", name="in_pool")
*/
protected $inPool;

/**
* One image has many votes
* @ORM\OneToMany(targetEntity="Vote", mappedBy="image")
*/
private $votes;

child :

class Vote
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\ManyToOne(targetEntity="Image", inversedBy="votes")
* @ORM\JoinColumn(onDelete="CASCADE")
*/
protected $image;

/**
* @ORM\Column(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;

如您所见,我在实体中设置了 @ORM\JoinColumn(onDelete="CASCADE")

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

An exception occurred while executing 'DELETE FROM image WHERE id = ?' with params [24]:

SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (konkurs.vote, CONSTRAINT FK_5A1085643DA5256D FOREIGN KEY (image_id) REFERENCES image (id))

用于根据 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

的输出

| vote | CREATE TABLE vote ( id int(11) NOT NULL AUTO_INCREMENT, date datetime NOT NULL, image_id int(11) DEFAULT NULL, PRIMARY KEY (id), KEY IDX_5A1085643DA5256D (image_id), CONSTRAINT FK_5A1085643DA5256D FOREIGN KEY (image_id) REFERENCES image (id) ) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |

最佳答案

添加@ORM\JoinColumn(onDelete="CASCADE")是对doctrine通过doctrine:schema:updatedoctrine管理的表的映射:架构:创建

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

默认情况下,创建外键引用时,它设置为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/consoledoctrine:schema:update --dump-sql 来确定编辑教义实体映射时的其他潜在错误配置。

<小时/>

或者,正如 @Cerad 提到的,您可以通过像这样使用 cascade={"remove"} 来告诉 Doctrine 管理关系,而不依赖于外键引用。

class Image 
{
//...

/**
* One image has many votes
* @ORM\OneToMany(targetEntity="Vote", mappedBy="image", cascade={"remove"})
*/
private $votes;
}

这将告诉 symfony 在删除 Image 实体时,为与 Image 实体关联的 Vote 实体集合发出删除语句。

需要注意的是,这仅在针对实体管理器而不是 DBAL 查询生成器发出命令时才有效。

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

关于php - 为什么我的级联不工作? - 违反完整性约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42562266/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com