2

Doctrine2エンティティの関連付けで問題が発生しています。ユーザーエンティティとエージェンシーエンティティがあります。1つのエージェンシーが複数のユーザーを雇用することができます(エンティティは私の問題のみを表示するように簡略化されています)

ユーザーエンティティ

/**
 * @Entity
 * @Table(name="users")
 **/
class User
{
    /**
     * @Id
     * @Column(type="integer")
     * @GeneratedValue
     * @var integer
     **/
    protected $id;

    /**
     * @ManyToOne(targetEntity="Agency", inversedBy="users"})
     * @JoinColumn(name="agency_id", referencedColumnName="id")
     * @var Agency
     */
    protected $agency;
}

エージェンシーエンティティ

/**
 * @Entity
 * @Table(name="agencies")
 **/
class Agency
{
    /**
     * @Id
     * @Column(type="integer")
     * @GeneratedValue
     * @var integer
     **/
    protected $id;

    /**
     * @OneToMany(targetEntity="User", mappedBy="agency", cascade={"all"})
     * @JoinColumn(name="id", referencedColumnName="agency_id")
     * @var User[]
     */
    protected $users;


    /**
     * Add a user to the agency
     *
     * @param User $user
     * @return void
     */
    public function addUser(User $user) {

        $this->users[] = $user;
    }
}

次のコードを使用してユーザーと一緒にエージェンシーを作成すると、Doctrineはユーザーのagency_idを設定しないため、ユーザーのagency_idがnullであってはならないというmysqlの制約エラーが発生します。

// $em is the Doctrine EntityManager
$agency = new Agency;
$user = new User;
$agency->addUser($user);
$em->persist($agency);
$em->flush();

これまでのところ、Doctrineにユーザーのagency_idを設定させる唯一の方法は、ユーザーをエージェンシーに追加することに加えて、エージェンシーをユーザーに割り当てることです。私のORMの理解では、ユーザーがエージェンシーのユーザーコレクションに含まれていて、保存されているときに、すでにエージェンシーIDを設定しているはずです。

$user->agency = $agency;
$agency->addUser($user);

アノテーション/メタデータに何か問題や欠落がありますか?

4

1 に答える 1

1

Doctrine2のドキュメントで何かを見つけました。

アソシエーションの逆側にのみ加えられた変更は無視されます。双方向アソシエーションの両側(または、Doctrineの観点からは少なくとも所有側)を必ず更新してください。

私の場合のように、所有側はユーザーであり、更新する必要があります。Doctrine1はそれを自動的に管理することができました...残念です。

于 2012-08-09T07:39:15.540 に答える