我在插入具有相关实体UserProfile的用户实体时遇到问题。
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()为我提供了UserProfile的User对象。到目前为止一切都很好。
Mysql通过自动增量PK生成唯一标识。要插入实体,我必须这样做:
$em->persist($user)
$em->flush()
将PK作为持久化和刷新UserProfile的id。
但是教条CANT插入$ user因为$ user对象具有从表单类型收到的相关$ 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,
));
}
更新:异常消息 Entity \ UserProfile类型的实体通过外部实体Entity \ User具有标识,但是该实体本身没有标识。您必须在相关实体上调用EntityManager#persist(),并确保在尝试持久化'Entity \ UserProfile'之前生成了标识符。如果生成后插入ID(例如MySQL自动增量或PostgreSQL SERIAL),这意味着您必须在两个持久操作之间调用EntityManager#flush()。
问:如何妥善处理这个问题?抱歉我生气的英语。
答案 0 :(得分:1)
问题是你要通过不拥有一方来攻击物体。拥有方是具有“inversedBy”属性的方。你应该坚持这样的对象。
您可以在此处详细了解:http://docs.doctrine-project.org/en/latest/reference/unitofwork-associations.html
所以,例如你的案例:
$profile->setUser($user);
$em->persist($profile).
$em->flush();
虽然,如果你想保持现有的方式,有两种选择:
1)将User
实体作为拥有方,将UserProfile
作为反方
或
2)在User
课程中的个人资料制定者中执行类似的操作:
public function setUserProfile(UserProfile $profile)
{
$this->profile = $profile;
$this->profile->setUser($this);
}
修改强>
我刚刚注意到你的UserProfile
实体中没有“id”字段 - 可能这就是原因。最简单的方法是单独的主键和外键。但是,如果你想把外国人视为主要人物,请看看这篇文章:http://docs.doctrine-project.org/en/latest/tutorials/composite-primary-keys.html#identity-through-foreign-entities