Может кто-нибудь объяснить мне это:
$user = new User(); /* why do I have to call Entity Comment while trying to insert into db? */ $myFirstComment = new Comment(); $user->addComment($myFirstComment); $em->persist($user); $em->persist($myFirstComment); $em->flush();
Почему я должен вызывать комментарий Entity, пытаясь вставить в db?
У меня есть каскад для этого.
Если мне нужно называть все эти отношения вручную, то совсем глупо использовать Doctrine.
Я этого не понимаю. Любая помощь приветствуется.
Это связано с этим: doctrine 2, неспособный вставить в базу данных, когда присутствует отношение
Чтобы Doctrine автоматически справлялась с сохранением свойства User#comments
вы должны установить каскад в операцию «persist».
Опция cascade (persist, remove, merge, all) дает вам возможность ommit …
$em->persist($myFirstComment);
… если вы правильно установили его на обратной стороне двунаправленного отношения, например. Он также может автоматически удалять User#comments
если вы удаляете объект пользователя с каскадом «удалить»!
пример:
/** * Bidirectional - One-To-Many (INVERSE SIDE) * * @OneToMany(targetEntity="Comment", mappedBy="author", cascade={"persist", "remove"}) */ private $comments;
Подробнее о картировании ассоциации и каскаде в главе « Параметры Transistive Persistence / Cascade Options» в документации.
Пожалуйста, помните:
Доктрина будет проверять только принадлежность ассоциации к изменениям.
Изменения, внесенные только в обратную сторону ассоциации, игнорируются. Не забудьте обновить обе стороны двунаправленной ассоциации (или, по крайней мере, стороны-владельца, с точки зрения Доктрины)
mappedBy
содержит имя поля ассоциации на стороне владельца inversedBy
содержит имя поля ассоциации на обратной стороне. Более того:
вам нужно только вызывать persist, если вы создаете новый корневой объект (т.е. $user = new User()
), который еще не управляется доктриной (и вам не нужно вызывать $myFirstComment
on $myFirstComment
в вашем примере, если вы установили каскадный вариант правильно).
В противном случае вам нужно будет только сбросить флажок, если объект по какой-то причине не был отсоединен.