0

我在更新实体时遇到问题。

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

用户的架构是:

  • ID INT
  • 用户名 STRING
  • group_id INT 默认 NULL

组的架构是:

  • ID INT
  • 名称字符串

组.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;
    }
}

用户.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.

教义注释中的错误吗?

4

2 回答 2

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;
}
于 2012-09-29T21:56:02.527 回答
1

如果您查看您的 setUsers 函数,您会注意到,当您传递一个 emtpy 数组时(就像您在尝试删除所有用户时所做的那样),简单地跳过了 foreach 循环并维护了用户实体的 group_id。

尽管 mbinette 的回答是正确的,但我建议制作一个单独的函数来删除用户。根据 mbinette 的建议,在添加新用户时,您必须添加阵列中的所有用户,因为您首先将它们全部删除。

public function removeUsers() {
    foreach ($this->users as $user) {
        $user->setGroup(null);
    }
}
于 2012-09-30T14:57:25.313 回答