Symfony2 Doctrine插入实体与相关 - NOT UPDATE

时间:2014-01-24 00:04:13

标签: forms symfony doctrine-orm

我在插入具有相关实体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()。

问:如何妥善处理这个问题?

抱歉我生气的英语。

1 个答案:

答案 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