我的问题:当我删除一个项目实体时,它被从Project表中移除,但是这个项目和标记之间的project_tag表中的关系没有被删除。然后,如果我创建了一个新的项目实体,就会抛出一个异常。
An exception exists while executing 'INSERT INTO project_tag (project_id, tag_id) VALUES (?,?)' With params [2, 4]:
SQLSTATE [23000]: Integrity constraint violation: 19 UNIQUE constraint failed: project_tag.project_id, project_tag.tag_id
实体:
标签
/**
* Tag
*
* @ORM\Table(name="tag")
* @ORM\Entity(repositoryClass="AppBundle\Repository\TagRepository")
*/
class Tag
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255, unique=true)
*/
private $name;
/**
* @ORM\Column(name="last_use_at", type="datetime", nullable=false)
* @var \DateTime
*/
private $lastUseAt;
public function __construct()
{
$this->lastUseAt = new \DateTime();
}
public function __toString()
{
return $this->name;
}
/**
* Get id
*
* @return int
*/
public function getId()
{
return $this->id;
}
/**
* Set name
*
* @param string $name
*
* @return Tag
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* Get name
*
* @return string
*/
public function getName(): string
{
return $this->name;
}
/**
* @return \DateTime
*/
public function getLastUseAt(): \DateTime
{
return $this->lastUseAt;
}
/**
* @param \DateTime $lastUseAt
*/
public function setLastUseAt(\DateTime $lastUseAt)
{
$this->lastUseAt = $lastUseAt;
}
}
trait Taggable
{
/**
* @var ArrayCollection
*
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\Tag", cascade={"persist"})
*/
protected $tags;
/**
* Add tag
*
* @param Tag $tag
*
* @return $this
*/
public function addTag(Tag $tag)
{
$tag->setLastUseAt(new \DateTime());
$this->tags[] = $tag;
return $this;
}
/**
* Remove tag
*
* @param Tag $tag
*/
public function removeTag(Tag $tag)
{
$this->tags->removeElement($tag);
}
/**
* Get tags
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getTags()
{
return $this->tags;
}
}
/**
* Project
*
* @ORM\Table(name="project")
* @ORM\Entity(repositoryClass="AppBundle\Repository\ProjectRepository")
*/
class Project
{
use Taggable;
}
class Note
{
use Taggable;
}
$project->getTags()->clear();
控制器中操作的完整代码:
/**
* @Route("/project/{id}/delete", name="project_delete")
*/
public function deleteAction($id) {
$em = $this->getDoctrine()->getManager();
$project = $em->getRepository('AppBundle:Project')->find($id);
if(!$project) {
return $this->redirectToRoute('index');
}
$project->getTags()->clear();
$em->remove($project);
$em->flush();
return $this->redirectToRoute('index');
}
我想我找到了一个更好的解决方案:您可以在条令配置中设置PRAGMA。如:
doctrine:
dbal:
# configure these for your database server
driver: 'pdo_sqlite'
#server_version: '5.7'
#charset: utf8mb4
#default_table_options:
#charset: utf8mb4
#collate: utf8mb4_unicode_ci
url: '%env(resolve:DATABASE_URL)%'
options:
'PRAGMA foreign_keys': 'ON'
我只是在我的Symfony4应用程序上试用了它,重新创建了数据库,并使用DB浏览器for SQLite进行了测试,结果它如我预期的那样工作。
希望这有帮助
参考Symfony 2关于文件上传的Cookbook,我尝试使用Doctrine的@PostRemove事件监听器在文件从数据库中删除后删除文件。 Document.php File.php 数据库: 当我删除ID为1的文档时,不知何故学说也解除关联ID为1的文件。 据我所知,这些步骤导致了这种奇怪的行为: 1-条令的将调用方法,该方法反过来调用 2-在中,参与者根据文档的id删除了文档的文件,然
在一个理论实体中,我有这样的配置: 当我删除实体时,它会尝试首先删除表,而不是连接的表,因此我会得到以下错误:
我更新了实体文件以包含关系映射。
问题内容: 我要删除具有多对多关系的一个站点上的表中的一行。我还想删除该关系另一侧的所有相关行。 例如,假设我有以下表格,并且想从中删除一行。我也想从中删除所有相关的行,当然,也删除其中不再需要的任何行。 我知道如何在查询中连接以上表格。但是我看不到如何删除整个关系中的数据。 注意:关系的两端都实现级联删除。因此,例如,从中删除行将删除中的任何相关行。但是显然,这不会传播到表中。 问题答案: 我认
我的实体: 这就是我的问题,实际上很少有。 问题1: 我删除了一个Cat对象,设置了cascade类型。所有在Cat中拥有的列表中,因此当我删除Cat对象时,UC中带有Cat的所有记录都将被删除,但我得到“已删除的对象将通过级联重新保存”,这是因为我在UC中与用户有另一个关系,用户将UC存储在列表中。当我从UC中删除Cat对象和记录时,我不想删除用户对象,因此在UC中的@ManyToOne上设置c
问题内容: 我分别在端口8006和8007上托管特殊的HTTP和HTTPS服务。我使用iptables来“激活”服务器;即路由传入的HTTP和HTTPS端口: 这就像一个魅力。但是,我想创建另一个脚本来再次禁用服务器。也就是说,将iptables恢复到运行上述行之前的状态。但是我很难弄清楚删除这些规则的语法。似乎唯一起作用的是完全冲洗: 但这也会删除其他不希望的iptables规则。 问题答案: