2

Person、Affiliation、PersonAffiliation の 3 つのエンティティがあります。

私のフォームでは、各所属をチェックボックスとして表示します。

ユーザーがチェックボックスをオフにして送信をクリックすると、この所属は PersonAffiliation テーブルから削除されます。

問題は、チェックを外さずに送信すると、データが重複することです。例: aff1 と aff2。チェックして送信すると、aff1 aff1 aff2 aff2 が取得されます。同じです。aff2 のチェックを外すと、aff1 aff1 になります。

エラーはおそらく教義の使用のどこかにあります:

これが私がそれを管理する方法です:

  • エンティティパーソム

    @ORM\OneToMany(targetEntity="PersonAffiliation", mappedBy="person", cascade={"persist", "remove"})
    protected $affiliations;
    
  • エンティティの所属:

    @ORM\OneToMany(targetEntity="PersonAffiliation", mappedBy="affiliation")
    protected $person_affiliations;
    
  • Entity 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;
    

それを解決する方法についてのアイデアはありますか?

ありがとうございました。

編集:

コントローラー部:

foreach( $enquiry->getAffiliations() as $aff )
    {
    $pAff   = new PersonAffiliation();
    $pAff->setPersonId( $person->getId() );
    $pAff->setAffiliationId( $aff->getAffiliation()->getId() );
    $pAff->setPerson( $person );
    $pAff->setAffiliation( $aff->getAffiliation() );
    $em->persist($pAff);
    $em->flush();
}

フォーム パーツ:

   public function buildForm(FormBuilder $builder, array $options)
{

    $person = $this->person;
    $user   = $this->user;

    $builder->add('firstname', 'text');
    $builder->add('middlename', 'text', array('required'=>false));
    $builder->add('lastname', 'text');
    $builder->add('sex', 'choice', array( 'choices'   => array('m' => 'Male', 'f' => 'Female'),
                                          'required'  => true, 
                                          'multiple'  => false,
                                          'expanded'  => true));
    $builder->add('email', 'text', array('required'=>false));

    if( $this->addAffiliations ) {
        $builder->add('affiliations', 'entity', array(
            'label' => 'Athor\'s affiliations',
            'class' => 'SciForumVersion2Bundle:PersonAffiliation',
            'query_builder' => function($em) use ($person, $user){
            return $em->createQueryBuilder('pa')
                ->where('pa.person_id = :pid')
                ->setParameter('pid', $person->getId());
        },
            'property'    => 'affiliation',
            'multiple' => true,
            'expanded' => true,
        ));
    }
}
4

2 に答える 2

1

Personエンティティ:

/**
* @ORM\ManyToMany(targetEntity="Affiliation", inversedBy="people")
* @ORM\JoinTable(name="PersonAffiliation")
*/
protected $affiliations;

そして、所属エンティティでは:

/**
* @ORM\ManyToMany(targetEntity="Person", mappedBy="affiliations")
*/
protected $people;
于 2012-11-15T13:38:12.500 に答える
0

$em->flush()foreachの各反復でを作成しました。foreachの終了後に実行する必要がありますか?

さらに、ManyToManyリレーションを使用することもできます。

于 2012-11-14T20:47:29.633 に答える