1

1 人のユーザーがアイテムを 1 つしか持っていない場合もあれば、何も持っていない場合もあります。(1-1..0 の関係)

私は教義を使ってsymfony2でそれを達成しようとしています。

私は 1 対 1 の関係を達成しました。それはかなり単純です。しかし、ユーザーを作成したいときにアイテムがnullになる可能性があることを教義に指定するにはどうすればよいですか? (新しい行を挿入せず、id_item を null のままにする)

これは私が持っているものです:

user.orm.yml ファイル

oneToOne:
  userItem:
    targetEntity: SOA\AXBundle\Entity\Items
    cascade: ["remove", "persist"]
    joinColumn:
      name: id_item        
      referencedColumnName: id        
      nullable: true

そしてもちろん、ItemsTypeForm クラスを作成し、タイプを userstypeform クラスに追加しました。

    // UsersTypeForm Class
    ->add('userItem', new \SOA\AXBundle\Form\ItemsTypeForm())

コントローラーアクションはこんな感じで、

public function addUserAction(Request $request) {

  $user = new User();

  $form = $this->createForm(new UseType(), $user);

  if ($request->getMethod() == 'POST') {

     $form->bindRequest($request);

     if ($form->isValid()) {

         $em = $this->getDoctrine()->getEntityManager();
         $em->persist($user);
         $em->flush();

         return $this->redirect($this->generateUrl('homepage'));
     }
  }

}

新しいユーザーを追加すると、すべてうまくいきます。アイテムだけでなくユーザーも挿入されます。しかし、アイテムを持たないユーザーを追加しようとすると (ユーザー アイテム フィールドが空白)、次のエラーが発生します。

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

null 値で項目を挿入しようとしています。

1 対 1 の関係でも生きていけるけど、1 対 1..0 の関係を作る方法を学びたい。

4

1 に答える 1

0

データベース スキーマは問題ありません (ユーザー テーブル定義でデータベースを直接調べれば、"item_id" フィールドに null を使用できることを確認できます)。

問題は、フォームに入力して送信すると、Symfony はすべてのフィールドが null に設定された Item オブジェクトを作成することです (アイテムに関連するフォームのすべてのフィールドが空であるため)。すべてのフィールドが null の場合、フレームワークは Item オブジェクトを永続化してはならないことをどうにかして伝える必要があります。私の意見では、これを達成する最善の方法は DataTransformer を使用することです。

ここでそれについて読むことができます:

http://symfony.com/doc/2.0/cookbook/form/data_transformers.html

通常、Transformer::reverseTransform では、すべてのフィールドが空かどうかを確認し、空である場合は Item オブジェクトの代わりに null を返します。

于 2012-09-06T07:19:27.287 に答える