8

私は5つのエンティティを持っています:

  • ユーザー、
  • 人、
  • UserAffiliation、
  • PersonAffiliationおよび
  • 所属

スキーマは次のとおりです。

ここに画像の説明を入力してください

いくつかの詳細:

  • WebUserは、Webサイトに登録されている人です。Webユーザーごとに、個人IDがあります。

  • 人は、Webユーザー、作成者などになります。

  • 各WebUserには0以上の所属があります。これらのアフィリエーションは、このWebUserによって作成され、有効なUserAffiliationsにリンクされています。

  • WebUserは、自分が作成したアフィリエーションを個人にリンクすることもでき(その個人が作成者の場合)、エンティティPersonAffiliationにデータが入力されます。

私は今、ウェブユーザーに著者(人)に所属を割り当てる可能性を与えようとしています。そのために、私は持っています:

  • エンティティパーソン

    @ORM\OneToMany(targetEntity="PersonAffiliation", mappedBy="person", cascade={"persist", "remove"})
    
    protected $affiliations;
    
  • PersonAffiliationで

    @ORM\ManyToOne(targetEntity="Person", inversedBy="affiliations")
    @ORM\JoinColumn(name="person_id", referencedColumnName="id")
    
    protected $person;
    
    @ORM\ManyToOne(targetEntity="Affiliation", inversedBy="person_affiliations")
    @ORM\JoinColumn(name="affiliation_id", referencedColumnName="id")
    
    protected $affiliation;
    
  • エンティティユーザーの場合:

    @ORM\OneToMany(targetEntity="UserAffiliation", mappedBy="user")
    
    protected $affiliations;
    
    
    @ORM\ManyToOne(targetEntity="Person")
    @ORM\JoinColumn(name="person_id", referencedColumnName="id")
    
    protected $person;
    
  • エンティティUserAffiliationで

    @ORM\ManyToOne(targetEntity="User", inversedBy="affiliations")
    @ORM\JoinColumn(name="user_id", referencedColumnName="id")
    
    protected $user;
    
    
    @ORM\ManyToOne(targetEntity="Affiliation", inversedBy="user_affiliations")
    @ORM\JoinColumn(name="affiliation_id", referencedColumnName="id")
    
     protected $affiliation;
    

フォームでは、私は次のことをしています:

$builder->add('affiliations', 'entity', array(
            'class' => 'SciForumVersion2Bundle:PersonAffiliation',
            'query_builder' => function($em) use ($person){
            return $em->createQueryBuilder('pa')->where('pa.person_id = :id')->setParameter('id', $person->getId());
        },
            'property'    => 'affiliation',
            'multiple' => true,
            'expanded' => true,
        ));

しかし、これはすべて私が望むように正しく機能していません。

説明:新しいアフィリエーションを追加しようとすると、WebUserに対してのみ追加され、フォームを介して作成者(Person)にリンクできません。

これを解決する方法、またはおそらく良いチュートリアルについてのアイデアがありますか?

4

2 に答える 2

2

これは、Entity1Controller.phpで処理する必要があります。

public function createAction(Request $request)
{
  $securityContext = $this->get('security.context');
  $em = $this->getDoctrine()->getManager();
  $form = $this->createForm(new Entity1Type()
     ,null,array('attr' => array('securitycontext' => $securityContext)));
  $form->bind($request);

  if ($form->isValid()){
    $data = $form->getData();
    $entity1id = $data->getId();
    $entity2id = $data->getEntity2Id();
    $entity1medicaid=$data->getMedicaidID();
    $entity1=$em->getRepostiory('projectBundle:Entity1')->findOneById($entity1id);
    $entity2=$em->getRepository('projectprojectBundle:Entity2')->findOneById($entity2id);
    if (null === $entity1){
      $entity1=new entity1();
      $entity1->setEntity2id($entity2id);
      $entity1->setID($entity1id);
    }
    if (null === $entity2){
      $entity2=new entity2();
      $entity2->setID($entity2id);
    }
    $em->persist($entity1);
    $em->persist($entity2);
    $em->flush();
    return $this->redirect($this->generateUrl('entity1', array()));
  }

  return $this->render('Bundle:entity1:new.html.twig', array(
      'form'   => $form->createView()
     ,'attr' => array('securitycontext' => $securityContext
     )
  )
  );
}

アソシエーションマッピングでカスケード永続化を設定する必要がある場合もあります。Entity1.yml:

project\projectBundle\Entity\Entity1:
    type: entity
    table: entity1
    repositoryClass: project\projectBundle\Entity\Entity1Repository
    fields:
        id:
            type: bigint
            id: true
            generator:
                strategy: AUTO
        property:
            type: string
            length: 255
            unique: true
    manyToMany:
        entity2:
            targetEntity: entity2
            mappedBy: entity1
            cascade: ["persist"]

理論的には、symfonyはentity2を内部で作成し、2番目のif null句を不要にしますが、それは常に私を悩ませるので、明示的に行うことを好みます。

于 2012-11-16T19:28:23.490 に答える
2

このフォームがコレクションを WebUser エンティティにバインドしている場合、そのようなクラスのオブジェクトをコントローラーで作成したフォームに渡しているためです。つまり、次のことを意味します。

$webUser = new WebUser();

$this->createForm(new SubmissionAffiliationFormType(), $webUser);

または、DefaultOptions を設定せず、バインドする必要がある data_class を明示的に伝えることで、使用するクラスの決定を Symfony フォームに委任しています。

class SubmissionAffiliationFormType extends AbstractType
{

    //...

    public function getDefaultOptions(array $options)
    {
        return array(
            'data_class' => 'Acme\DemoBundle\Entity\Person',
        );
    }
}
于 2012-11-16T21:24:02.173 に答える