无法更新“OneToMany”儿童

时间:2012-09-28 15:14:38

标签: doctrine-orm zend-framework2

我在更新实体方面遇到了问题。

每个用户只能在一个组中。

用户的架构是:

  • id INT
  • 用户名STRING
  • group_id INT DEFAULT NULL

小组的模式是:

  • id INT
  • 名称STRING

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注释中是错误的吗?

2 个答案:

答案 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);
    }
}