我遇到了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);
我的注释/元数据是否有任何错误或缺失?
答案 0 :(得分:1)
我在Doctrine 2文档中找到了一些东西:
忽略仅对关联的反面进行的更改。 确保更新双向关联的两侧(或在 至少是拥有方,从学说的角度来看)
在我的情况下,拥有方是用户我必须更新它。 Doctrine 1能够自动管理它......太糟糕了。