我有父母和子女实体,父母是图像,孩子是对图像的投票
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无法删除或 更新父行:外键约束失败(
konkurs
。vote
, 约束FK_5A1085643DA5256D
外键(image_id
)参考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
(id
int(11)不是null auto_increment,date
dateTime而不是null,image_id
int(11) 默认为null,主键(id
),键IDX_5A1085643DA5256D
(image_id
),约束FK_5A1085643DA5256D
外键 (image_id
)参考image
(id
))引擎= Innodb auto_increment = 14默认charset = utf8 caltrate = utf8_unicode_ci |
添加 @ORMJoinColumn(onDelete="CASCADE")
是通过 doctrine:schema:update
或 doctrine: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