0

エンティティの更新に問題があります。

各ユーザーは1つのグループにのみ参加できます。

ユーザーのスキーマは次のとおりです。

  • id INT
  • ユーザー名STRING
  • group_id INT DEFAULT NULL

グループのスキーマは次のとおりです。

  • id INT
  • 名前文字列

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アノテーションの間違いですか?

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 関数を見ると、(すべてのユーザーを削除しようとするときのように) 空の配列を渡すと、foreach ループが単純にスキップされ、ユーザー エンティティの group_id が維持されることがわかります。

mbinette の答えは正しいですが、ユーザーを削除するための別の関数を作成することをお勧めします。mbinette の提案では、新しいユーザーを追加するときに、最初にすべてのユーザーを削除するため、配列内のすべてのユーザーを追加する必要があります。

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