我在更新实体方面遇到了问题。
每个用户只能在一个组中。
用户的架构是:
小组的模式是:
Group.php
class Group {
/**
* @ORM\OneToMany(targetEntity="Saprizo\Entity\User", mappedBy="group", cascade={"all"})
*/
protected $users;
public function setUsers($users) {
foreach ($users as $user) {
$user->setGroup($this);
}
$this->users = $users;
}
}
user.php的
class User {
/**
* @ORM\ManyToOne(targetEntity="SaprizoStatistics\Entity\Group", inversedBy="users", cascade={"all"})
* @ORM\JoinColumn(name="group_id", referencedColumnName="id", nullable=true)
*/
protected $group;
}
当我尝试将新用户添加到
组时$group->setUsers(array($user1, $user2));
$em->persist($group);
$em->flush();
它保存所有值。
但是当我尝试从
组中删除所有用户时$group->setUsers(array());
$em->persist($group);
$em->flush();
它什么都不做。据我所知,在设置一个空数组并保存后,user1和user2的group_id列应更改为null
。
在Doctrine注释中是错误的吗?
答案 0 :(得分:1)
在Doctrine的注释中,这不是一个错误。您永远不会从组中删除旧用户。将它们添加到组后,您需要手动删除它们。只需更改setUsers()
方法。
public function setUsers($users) {
//Remove old users first
foreach ($this->users as $user) {
$user->setGroup(null);
}
//Now we can add the new ones and replace the array
foreach ($users as $user) {
$user->setGroup($this);
}
$this->users = $users;
}
答案 1 :(得分:1)
如果查看setUsers函数,您会注意到当您传递一个emtpy数组时(正如您尝试删除所有用户时那样),只需跳过foreach循环并维护用户实体的group_id。 / p>
虽然mbinette的答案是正确的,但我建议您使用separte函数删除用户。根据mbinette的建议,在添加新用户时,您必须添加阵列中的所有用户,因为您首先将它们全部删除。
public function removeUsers() {
foreach ($this->users as $user) {
$user->setGroup(null);
}
}