Doctrine 2实体关联不为外键设置值

时间:2012-08-09 07:15:16

标签: php doctrine-orm associations entity

我遇到了Doctrine 2实体关联的问题。 我有一个User实体和一个Agency实体。一个代理商可以雇用多个用户(简化实体以仅显示我的问题)

用户实体

/**
 * @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,这会导致mysql约束错误,即用户的agency_id不能为空。

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

到目前为止,我发现让Doctrine为用户设置agency_id的唯一方法是将代理商分配给用户另外将用户添加到代理商。在我对ORM的理解中,当用户在某个代理商的用户集合中并且它已经被保存时,它应该已经设置了agency_id。

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

我的注释/元数据是否有任何错误或缺失?

1 个答案:

答案 0 :(得分:1)

我在Doctrine 2文档中找到了一些东西:

  

忽略仅对关联的反面进行的更改。   确保更新双向关联的两侧(或在   至少是拥有方,从学说的角度来看)

在我的情况下,拥有方是用户我必须更新它。 Doctrine 1能够自动管理它......太糟糕了。