无法更新"OneToMany"子项



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

每个用户只能位于一个组中。

用户的架构为:

  • id INT
  • 用户名字符串
  • group_id 整数默认值

组的架构为:

  • id INT
  • 名称字符串

组.php

class Group {
    /**
     * @ORMOneToMany(targetEntity="SaprizoEntityUser", mappedBy="group", cascade={"all"})
     */
    protected $users;
    public function setUsers($users) {
        foreach ($users as $user) {
            $user->setGroup($this);
        }
        $this->users = $users;
    }
}

用户.php

class User {
    /**
     * @ORMManyToOne(targetEntity="SaprizoStatisticsEntityGroup", inversedBy="users", cascade={"all"})
     * @ORMJoinColumn(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();

它什么都不做。据我了解,在设置一个空数组并将其保存在用户 1 和用户 2 的列group_id后,应该更改为 null .

教义注释有误吗?

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

尽管mbinette的答案是正确的,但我建议创建一个单独的功能来删除用户。根据 mbinette 的建议,添加新用户时,您必须添加数组中的所有用户,因为您首先删除了它们。

public function removeUsers() {
    foreach ($this->users as $user) {
        $user->setGroup(null);
    }
}

这不是教义注释中的错误。您永远不会从组中删除旧用户。将它们添加到组后,您需要手动删除它们。只需更改您的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;
}

相关内容

  • 没有找到相关文章

最新更新