我在使用相关实体userProfile插入用户实体时有问题。
class User
{
/**
* @var integer
*
* @ORMId
* @ORMColumn(name="id", type="integer", options={"unsigned"=true})
* @ORMGeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @var UserProfile
*
* @ORMOneToOne(targetEntity="UserProfile", mappedBy="user", cascade={"persist", "remove"})
*/
protected $profile
....
}
class UserProfile
{
/**
* @var User
*
* @ORMId
* @ORMGeneratedValue
* @ORMOneToOne(targetEntity="User", inversedBy="profile" )
* @ORMJoinColumn(name="user_id", referencedColumnName="id")
*/
protected $user;
.....
}
标准的用户 - 用户填充双向关系。当我提交表单包含来自用户实体和用户填充实体的字段时,$ form-> getData()为我提供了用户对象的用户对象。到目前为止还不错。
mySQL通过自动灌溉PK生成独特的身份。要插入实体,我必须做:
$em->persist($user)
$em->flush()
将PK作为持续和齐平的用户for的ID。
但学说不能插入$用户,因为$用户对象具有相关的$ 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,
));
}
更新:异常msg 类型实体的实体 UserProfile具有通过外国实体实体用户具有身份,但是该实体本身没有身份。您必须在相关实体上调用EntityManager#Persist(),并确保在尝试坚持" Entity userProfile"之前生成标识符。如果是插入ID ID生成(例如MySQL自动increment或postgresql serial),这意味着您必须在两个持久操作之间调用EntityManager#flush()。
问:如何正确处理此问题?
对不起我的生锈的英语。
问题是,您将通过不拥有一侧来蠕动对象。拥有一方是具有"反向"属性的一方。而且您应该以这种方式持续存在。
您可以在此处阅读更多有关它的信息: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-trough-foreign-foreign-foreign-entities