当删除具有关联的实体时,所有相关数据都被删除但想在 symfony 中保留关联数据
When deleting an entity with associate all related data is deleted but want to keep associate data in symfony
我有两个实体如下:-
- 网站
- Posts
在网站实体中,我给出了 OneToMany
关系,在帖子实体中,我给出了 ManytoOne
关系。
网站实体:-
/**
* @var Collection<Post>
*
* @ORM\OneToMany(targetEntity="App\Domain\Entity\Post\Post", mappedBy="website", cascade={"all"})
*/
private Collection $posts;
Post实体:-
/**
* @ORM\ManyToOne(targetEntity="App\Domain\Entity\Website\Website", inversedBy="posts")
* @ORM\JoinColumn(name="website_id", referencedColumnName="id", onDelete="SET NULL")
*/
private ?Website $website = null;
问题是,当我删除一个如此相关的网站时,该网站的所有帖子都被删除了,但我想保留该网站的相关帖子(我有已删除的网站)。
您已在 $posts
上设置 cascade={"all"}
。 all
是“坚持、删除、合并、分离、刷新”的别名。
这是文档中关于 Cascade Operations 的内容:
Even though automatic cascading is convenient, it should be used with care. Do not blindly apply cascade=all to all associations as it will unnecessarily degrade the performance of your application.
而且,就像您刚刚经历的那样,应用 all
会使您更难理解在处理实体时发生的情况。在您的情况下,您可能只需要 persist
:
@ORM\OneToMany(targetEntity="App\Domain\Entity\Post\Post", mappedBy="website", cascade={"persist"})
如果你想了解级联操作,this answer会对你有很大帮助。
我有两个实体如下:-
- 网站
- Posts
在网站实体中,我给出了 OneToMany
关系,在帖子实体中,我给出了 ManytoOne
关系。
网站实体:-
/**
* @var Collection<Post>
*
* @ORM\OneToMany(targetEntity="App\Domain\Entity\Post\Post", mappedBy="website", cascade={"all"})
*/
private Collection $posts;
Post实体:-
/**
* @ORM\ManyToOne(targetEntity="App\Domain\Entity\Website\Website", inversedBy="posts")
* @ORM\JoinColumn(name="website_id", referencedColumnName="id", onDelete="SET NULL")
*/
private ?Website $website = null;
问题是,当我删除一个如此相关的网站时,该网站的所有帖子都被删除了,但我想保留该网站的相关帖子(我有已删除的网站)。
您已在 $posts
上设置 cascade={"all"}
。 all
是“坚持、删除、合并、分离、刷新”的别名。
这是文档中关于 Cascade Operations 的内容:
Even though automatic cascading is convenient, it should be used with care. Do not blindly apply cascade=all to all associations as it will unnecessarily degrade the performance of your application.
而且,就像您刚刚经历的那样,应用 all
会使您更难理解在处理实体时发生的情况。在您的情况下,您可能只需要 persist
:
@ORM\OneToMany(targetEntity="App\Domain\Entity\Post\Post", mappedBy="website", cascade={"persist"})
如果你想了解级联操作,this answer会对你有很大帮助。