У меня проблема с вставкой объекта пользователя с связанным объектом UserProfile.Symfony2 Doctrine insert entity with related - NOT UPDATE
class User
{
/**
* @var integer
*
* @ORM\Id
* @ORM\Column(name="id", type="integer", options={"unsigned"=true})
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @var UserProfile
*
* @ORM\OneToOne(targetEntity="UserProfile", mappedBy="user", cascade={"persist", "remove"})
*/
protected $profile
....
}
class UserProfile
{
/**
* @var User
*
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\OneToOne(targetEntity="User", inversedBy="profile")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
*/
protected $user;
.....
}
Стандартное двунаправленное отношение User-UserProfile. Когда я отправляю форму, содержит поля из объекта User и объекта UserProfile, $ form-> getData() дает мне объект User с UserProfile. Все идет нормально.
Mysql генерирует уникальный идентификатор с помощью автоинкремента PK. Чтобы вставить объект, я должен:
$em->persist($user)
$em->flush()
Чтобы получить PK как идентификатор для сохранения и очистки пользовательского файла.
Но доктрина CANT вставки $ пользователь, потому что объект $ пользователь связанные $ user-> профиль, полученный от формы Типа:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('email', 'email', array('label' => 'email'))
->add('profile', new RegistrationProfileFormType(), array('required'=>true,))
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'User',
'cascade_validation'=>true,
));
}
Update: Исключение тзда Entity типа Entity \ UserProfile имеет идентичность через иностранный объект Entity \ User, однако этот объект не имеет самоидентификации. Вы должны вызвать EntityManager # persist() для связанного объекта и убедиться, что был создан идентификатор, прежде чем пытаться сохранить «Entity \ UserProfile». В случае создания Post Insert ID Generation (например, MySQL Auto-Increment или PostgreSQL SERIAL) это означает, что вы должны вызывать EntityManager # flush() между обеими персистентными операциями.
Вопрос: Как правильно обращаться с этой проблемой?
Извините за мой ржавый английский.
Какое сообщение об исключении вы получаете при попытке отправить свою форму? – nifr
Проблема в том, как очистить объект от связанных для первого флеша, когда нет PK/id для связанных. Я сделал некоторое грязное обходное решение, но считаю, что это не так./ ** @ PrePersist { – d3uter
User Entity: /** @ ORM \ PrePersist */onPrePersist {unset ($ this-> profile)} и внутри контроллера $ profile = $ user-> getProfile(); $ Em-> сохраняются ($ пользователю); $ em-> flush ($ user); $ User-> setProfile ($ профиль); $ em-> flush ($ user) – d3uter