Intereting Posts

Как использовать параметр каскада в Doctrine2, чтобы связанные объекты автоматически сохранялись?

Может кто-нибудь объяснить мне это:

$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?

У меня есть каскад для этого.

  1. Означает ли это, что если у меня есть 50 отношений в User Entity с другими объектами, я должен вручную вызывать каждое отношение при попытке обновить / вставить / удалить?
  2. Почему существует каскад, если мне нужно делать все вручную?

Если мне нужно называть все эти отношения вручную, то совсем глупо использовать 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» в документации.

Пожалуйста, помните:

Доктрина будет проверять только принадлежность ассоциации к изменениям.

Изменения, внесенные только в обратную сторону ассоциации, игнорируются. Не забудьте обновить обе стороны двунаправленной ассоциации (или, по крайней мере, стороны-владельца, с точки зрения Доктрины)

  • Ассоциации OneToMany никогда не являются собственностью.
  • Обратная сторона должна использовать атрибут mappedBy объявления OneToOne, OneToMany или ManyToMany. mappedBy содержит имя поля ассоциации на стороне владельца
  • Собственная сторона должна использовать атрибут inversedBy объявления OneToOne, ManyToOne или ManyToMany. inversedBy содержит имя поля ассоциации на обратной стороне.
  • ManyToOne всегда является владением двунаправленной ассоциацией.
  • OneToMany всегда обратная сторона двунаправленной ассоциации.

Более того:

вам нужно только вызывать persist, если вы создаете новый корневой объект (т.е. $user = new User() ), который еще не управляется доктриной (и вам не нужно вызывать $myFirstComment on $myFirstComment в вашем примере, если вы установили каскадный вариант правильно).

В противном случае вам нужно будет только сбросить флажок, если объект по какой-то причине не был отсоединен.