Я встречаю проблему с ассоциацией сущностей Doctrine 2. У меня есть объект пользователя и объект агентства. Одно агентство может использовать несколько пользователей (объекты упрощены, чтобы показать только мою проблему)
Пользовательский объект
/** * @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 не устанавливает агент_и_ид для пользователя, который приводит к ошибке ограничения mysql, которая должна быть недействительной.
// $em is the Doctrine EntityManager $agency = new Agency; $user = new User; $agency->addUser($user); $em->persist($agency); $em->flush();
до сих пор единственным способом, который я нашел, чтобы Doctrine установить агент_ид для пользователя, назначает агентство пользователю дополнительно к добавлению пользователя в агентство. В моем понимании ORM он уже должен установить агент_ид, когда пользователь находится в пользовательской коллекции агентства, и он спасен.
$user->agency = $agency; $agency->addUser($user);
Есть что-то неправильно или отсутствует в моих аннотациях / метаданных?
Я нашел что-то в документации Doctrine 2:
Изменения, внесенные только в обратную сторону ассоциации, игнорируются. Не забудьте обновить обе стороны двунаправленной ассоциации (или, по крайней мере, стороны-владельца, с точки зрения Доктрины)
Как и в моем случае, владельцем является Пользователь, я должен его обновить. Доктрина 1 смогла справиться с ней автоматически … слишком плохо.