Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony 您如何设置移除时的级联?_Symfony_Doctrine Orm - Fatal编程技术网

Symfony 您如何设置移除时的级联?

Symfony 您如何设置移除时的级联?,symfony,doctrine-orm,Symfony,Doctrine Orm,我在删除某些对象时遇到一些问题,因为这些对象有其他与它们相关的对象 比如说。我有一个实体名为Home。该实体有一些字段,如名称和描述以及id 然后,我有一个名为Citizen的实体,它包含姓名、姓氏、家庭。最后一个字段与主字段直接相关 因此,如果我试图删除一个主对象,它会崩溃,因为有一些外键与该对象相关。我目前正在做的是寻找公民,并将其驱逐,但这不是实现这一目标的最佳方式 我知道有一个像CASCADE这样的注释,但我不知道在哪里放置这个注释 我必须在哪里设置此注释才能实现我的目标 谢谢。在您的家

我在删除某些对象时遇到一些问题,因为这些对象有其他与它们相关的对象

比如说。我有一个实体名为Home。该实体有一些字段,如名称和描述以及id

然后,我有一个名为Citizen的实体,它包含姓名、姓氏、家庭。最后一个字段与主字段直接相关

因此,如果我试图删除一个主对象,它会崩溃,因为有一些外键与该对象相关。我目前正在做的是寻找公民,并将其驱逐,但这不是实现这一目标的最佳方式

我知道有一个像CASCADE这样的注释,但我不知道在哪里放置这个注释

我必须在哪里设置此注释才能实现我的目标


谢谢。

在您的家庭实体中,您应该有包含所有公民的字段

    /**
     *
     * @OneToMany(targetEntity="Citizen", mappedBy="home", cascade={"remove"})
     */
     protected $citizens;

在您的主实体中,应该有包含所有公民的字段

    /**
     *
     * @OneToMany(targetEntity="Citizen", mappedBy="home", cascade={"remove"})
     */
     protected $citizens;

实际上有两种方法可以实现你的目标。可以使用ORM级和数据库级级联

ORM级别

数据库级

注意

在设置级联选项时必须小心

如果您删除了一个公民,您很可能不想让条令删除您的关系的拥有方。在本例中,如果您删除了一个公民,则删除家庭-因此只在您的家庭实体上设置它

Alesh的例子在您的用例中是错误的,因为mappedBy始终是关系的反面

在您的情况下,家庭将是拥有方,因为一个家庭将拥有多个公民。 现在,如果你删除家,你希望你的公民无家可归或被删除

条令也只跟踪关系的拥有方进行更改,现在如果您将公民添加到集合中,例如,集合表单类型为

$home->addCitizen($citizen);
。。。您可能希望您的公民在调用时自动持久化,并设置cascade persist

$em->flush();

实际上有两种方法可以实现你的目标。可以使用ORM级和数据库级级联

ORM级别

数据库级

注意

在设置级联选项时必须小心

如果您删除了一个公民,您很可能不想让条令删除您的关系的拥有方。在本例中,如果您删除了一个公民,则删除家庭-因此只在您的家庭实体上设置它

Alesh的例子在您的用例中是错误的,因为mappedBy始终是关系的反面

在您的情况下,家庭将是拥有方,因为一个家庭将拥有多个公民。 现在,如果你删除家,你希望你的公民无家可归或被删除

条令也只跟踪关系的拥有方进行更改,现在如果您将公民添加到集合中,例如,集合表单类型为

$home->addCitizen($citizen);
。。。您可能希望您的公民在调用时自动持久化,并设置cascade persist

$em->flush();

你误解了级联选项。如果cascade={remove}是@inversedSide,它会告诉您,如果所属的一方被删除了,就删除这个关联,而不是相反!这就是为什么我在我的例子中把它放在拥有方。。。mappedBy始终是反向方,InverseredBy始终是拥有方。阅读这里的更多内容。那么你说alesh的例子是错误的部分只是关系问题,而不是级联选项的问题?如果是这样的话,我误解了你:这就是为什么我在你的案例中加上的原因——他希望公民被驱逐,他将他们驱逐回家,这使得家成为拥有方,而在阿莱什的回答中,这是相反的一面。所以是的,这只是一个错误关系的问题:所以我误解了。。。。顺便说一句,我知道mappedBy总是关系的反面,你误解了cascade选项。如果cascade={remove}是@inversedSide,它会告诉您,如果所属的一方被删除了,就删除这个关联,而不是相反!这就是为什么我在我的例子中把它放在拥有方。。。mappedBy始终是反向方,InverseredBy始终是拥有方。阅读这里的更多内容。那么你说alesh的例子是错误的部分只是关系问题,而不是级联选项的问题?如果是这样的话,我误解了你:这就是为什么我在你的案例中加上的原因——他希望公民被驱逐,他将他们驱逐回家,这使得家成为拥有方,而在阿莱什的回答中,这是相反的一面。所以是的,这只是一个错误关系的问题:所以我误解了。。。。顺便说一句,我知道mappedBy总是关系的反方向