2

User entity extends FOSUserBundle entity を保持したいのですが、エラーが発生しました:

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

User エンティティの永続化機能をオーバーロードして、必要な情報を提供するにはどうすればよいですか?

私のユーザーエンティティ:

class User extends BaseUser
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
     protected $id;

     /**
      *
      * @ORM\OneToOne(targetEntity="MyApp\MainBundle\Entity\Project")
      */
     private $project;
...
}

私のプロジェクト エンティティ:

class Structure
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var integer $master
     *
     * @ORM\OneToOne(targetEntity="Uriae\UserBundle\Entity\User", cascade={"persist"})
     *
     * @Assert\NotBlank()
     * @Assert\Type(type="Uriae\UserBundle\Entity\User")
     */
    private $master;
...
}

応答するように編集 FractalizeR :

persist の後に usernameCanonical プロパティを手動で設定する必要があるということですか?

実際には、コントローラーでフォームが送信された後にそれを持っています:

$structure = new \Uriae\MainBundle\Entity\Structure();
if ($request->getMethod() == 'POST')
{
    $form->bindRequest($request);

    if ($form->isValid())
    {
       $em = $this->getDoctrine()->getEntityManager();
       $em->persist($structure);
       $em->flush();

       ...
    }
}

persist の後に usernameCanonical プロパティを手動で設定する必要があるということですか? またはいつどこで?しかし、特にどのように?

4

1 に答える 1

3

のインスタンスを作成してStructureから永続化/フラッシュしようとすると...Doctrine2は次のようになります。

  1. との関係があることを認識しStructureますUser(各Stuctureインスタンスにはインスタンスが必要ですUser
  2. Userインスタンスに明示的にバインドされていないStructureため、空のインスタンスを作成しようとします。
  3. User データがないため、保存操作は失敗します(この場合、usernameCanonical文字列は空です)

あなたがしなければならないことは...

保存する前にStructure、のインスタンスを追加しますUser...現在のユーザーを使用する場合は、これを使用します

$user = $this->get('security.context')->getToken()->getUser();
$structure->setMaster($user);
$em->persist($structure);
$em->flush();

(ステートメントUserとともに)コントローラークラスにエンティティを含めることを忘れないでください。use

于 2011-11-18T13:23:48.483 に答える