如何删除可能处于"OneToMany"关系中的实体

ins*_*ere 2 doctrine one-to-many symfony

我有两个实体:a Person和an Address.

  • 一个Person可以有一个Address
  • 一个人Address可以自给自足Person.

我创造了这样的关系:

地址

/**
 * @ORM\OneToMany(targetEntity="Person", mappedBy="address", cascade={"detach"})
 */
protected $persons;
Run Code Online (Sandbox Code Playgroud)

/**
 * @ORM\ManyToOne(targetEntity="Address", inversedBy="persons", cascade={"detach"})
 * @ORM\JoinColumn(name="address_id", referencedColumnName="id")
 */
protected $address;
Run Code Online (Sandbox Code Playgroud)

当我现在尝试删除与其结果Address相关的Person结果时,当然是在" 完整性约束违规 "中.我怎么能告诉学说简单地分离Address距离Person.如果尝试使用cascade={"detach"}两者但没有任何反应.

Zel*_*jko 5

人:

/**
* @ORM\ManyToOne(targetEntity="Address", inversedBy="persons")
* @ORM\JoinColumn(name="address_id", referencedColumnName="id", onDelete="SET NULL")
*/
protected $address;
Run Code Online (Sandbox Code Playgroud)

地址:

/**
* @ORM\OneToMany(targetEntity="Person", mappedBy="address", cascade={"all"})
*/
protected $persons;
Run Code Online (Sandbox Code Playgroud)

这个设置对我来说很完美.删除地址时,person将在address_id中获取NULL.如果您执行以下操作,Cascade all in Address也将保存新人:

$address->setPersons(
    array( $person1, $person2 )
) ;
Run Code Online (Sandbox Code Playgroud)

$ person的地方是:

$person1 = new Person() ;
$person1->setName(....) ;
Run Code Online (Sandbox Code Playgroud)

如果这不起作用,请从控制器或单元测试发送代码.它应该是最基本的代码; 如果你使用地址,你只需坚持地址实体.对于人实体也是如此.你不需要坚持两者,学说会照顾到这一点.