1

関連付けの削除にご協力をお願いします。

私のUserエンティティ:

class User
{
    ...

    /**
     * @ORM\ManyToMany(targetEntity="User", mappedBy="following")
     **/
    private $followers;

    /**
     * @ORM\ManyToMany(targetEntity="User", inversedBy="followers")
     * @ORM\JoinTable(name="friends",
     *      joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="friend_user_id", referencedColumnName="id")}
     * )
     **/
    private $following;

私には2つのアクションがあります:

プロフィール:フォロー

// followAction
$entityManager = $this->getDoctrine()->getEntityManager();

$me->addFollowing($targetUser);
$targetUser->addFollower($me);

$entityManager->persist($me);
$entityManager->persist($targetUser);

$entityManager->flush();

プロフィール:フォロー解除

$entityManager = $this->getDoctrine()->getEntityManager();

$me->removeFollowing($targetUser);
$targetUser->removeFollower($me);

$entityManager->persist($me);
$entityManager->persist($targetUser);

$entityManager->flush();

以下のプロセスは適切に機能しており、適切なレコードfriendsテーブルが表示されます。

しかし、ユーザーのフォローを解除しようとすると、例外が発生します:

パラメータ {"1":2,"2":10} を使用して「INSERT INTO friends (user_id, friend_user_id) VALUES (?, ?)」を実行中に例外が発生しました:

SQLSTATE [23000]: 整合性制約違反: 1062 キー 'PRIMARY' のエントリ '2-​​10' が重複しています

私は何を間違っていますか?私はpersistそれの有無にかかわらず試しましたが、同じです。多分関連設定の何か?

4

1 に答える 1

0

最初の間違いは 2 つの持続アクションです。必要なのは 1 つだけです。これをチェックして:

// class User

public function switchFollowingUser(User $user)
{
    if ( $this->following->contains($user) )
        $this->following->removeElement($user) ;
    else
        $this->following->add($user) ;
}

そしてコントローラはちょうど

$follower->switchFollowingUser($user) ;

必要に応じてこのメソッドを 2 つのメソッドに抽出しますが、短いのでこの方法を好みます。

2番目のこと:入れましたか

$this->following = new ArrayCollection() ;
$this->followers = new ArrayCollection() ;

__construct() で ?

これが機能するかどうか試してください。

于 2013-04-30T15:49:54.473 に答える