Symfony:如何配置嵌入式表单来创建新的子对象?

时间:2018-02-22 21:08:28

标签: symfony symfony4

我正在构建一个用户管理页面,用于创建或编辑用户。

用户由两个实体组成,用户个人资料,这些实体具有一对一的关系(我会合并,但由于历史原因不能)

/ * User.php - 实体类

/**
 * @var Profile
 * @Assert\Type(type="App\Entity\Profile")
 * @Assert\Valid()
 * @ORM\OneToOne(targetEntity="Profile", mappedBy="user", cascade={"persist"})
 */
private $profile;

/ * Profile.php - 个人资料实体类

/**
 * @var \App\Entity\User
 *
 * @ORM\OneToOne(targetEntity="App\Entity\User", inversedBy="profile")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="user_id", referencedColumnName="id")
 * })
 */
private $user;

我建了两个表格。

一种形式是个人资料表单,其中包含所有必要的个人资料字段(first_name,last_name,email),但未明确包含关系字段(user_id)。

另一种形式是用户表单,其中包含基本用户字段(用户名,密码),还包括个人资料表单。

    $builder->add('profile', ProfileForm::class);

当我使用此表单进行编辑时,一切正常,并且对两个对象的更改仍然存在。但是,当我尝试使用该表单创建新用户时,它失败了,说我错过了 user_id

    SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'user_id' cannot be null

看起来这应该有效,但我错过了一些东西。

1 个答案:

答案 0 :(得分:0)

感谢@Cerad的回答。我没有在我的User实体setProfile类中设置链接。

/**
 * Set profile
 *
 * @param \App\Entity\Profile $profile
 *
 * @return SfGuardUser
 */
public function setProfile(\App\Entity\Profile $profile = null)
{
    $this->profile = $profile;
    $this->profile->setUser($this);  // Adding this line fixed my issue

    return $this;
}