Milos Cuculovic
Milos Cuculovic

Reputation: 20223

Doctrine 2: Understand how entities works with doctrine 2

I have 3 Entities: Person, Affiliation and PersonAffiliation.

In my form, I will display each affiliation as a checked checkbox.

Nowm when the user uncecks the checkbox and click submit, this affiliation should be removed from the PersonAffiliation table.

The problem is that when I submit without unchecking, my data are duplicated. Example: aff1 and aff2. When both checked and submit, I will then get aff1 aff1 aff2 aff2. The same, If I uncheck aff2, I will then have aff1 aff1.

The error is probably somewhere in using the doctrine:

Here is how I am managing that:

An idea on how to resolve that?

Thank you.

EDIT:

Cotroller part:

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();
}

Form Part:

   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,
        ));
    }
}

Upvotes: 2

Views: 583

Answers (2)

jeremieca
jeremieca

Reputation: 1188

In the Person entity :

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

And in the Affiliation entity :

/**
* @ORM\ManyToMany(targetEntity="Person", mappedBy="affiliations")
*/
protected $people;

Upvotes: 1

jeremieca
jeremieca

Reputation: 1188

You made a $em->flush() on each iteration of the foreach. It should be done after the end of foreach isnt'it ?

Moreover, you may use a ManyToMany relation.

Upvotes: 0

Related Questions