1

M2Mの関係がありますが、アイテムを作成すると関係が保存されず、どこに問題があるのか​​わかりません。モデル:

class Serie
 {    

/**
 * @ORM\ManyToMany(targetEntity="Magazine", mappedBy="series")
 * */
protected $magazines;

/**
 * Constructor
 */
public function __construct()
{
    $this->magazines = new \Doctrine\Common\Collections\ArrayCollection();
}

/**
 * Add magazines
 *
 * @param MyList\DBBundle\Entity\Magazine $magazines
 * @return Serie
 */
public function addMagazine(\MyList\DBBundle\Entity\Magazine $magazines)
{
    $this->magazines[] = $magazines;

    return $this;
}

/**
 * Remove magazines
 *
 * @param MyList\DBBundle\Entity\Magazine $magazines
 */
public function removeMagazine(\MyList\DBBundle\Entity\Magazine $magazines)
{
    $this->magazines->removeElement($magazines);
}

/**
 * Get magazines
 *
 * @return Doctrine\Common\Collections\Collection 
 */
public function getMagazines()
{
    return $this->magazines;
}
}

雑誌のクラス:

class Magazine
{

/**
 * @ORM\ManyToMany(targetEntity="Serie" , inversedBy="magazines")
 * @ORM\JoinTable(name="magazines_series")
 * */
protected $series;

public function __construct()
{
    $this->series = new \Doctrine\Common\Collections\ArrayCollection();
}

/**
 * Add series
 *
 * @param MyList\DBBundle\Entity\Serie $series
 * @return Magazine
 */
public function addSerie(\MyList\DBBundle\Entity\Serie $serie)
{
    $serie->addMagazine($this);
    $this->series[] = $serie;

    return $this;
}

/**
 * Remove series
 *
 * @param MyList\DBBundle\Entity\Serie $series
 */
public function removeSerie(\MyList\DBBundle\Entity\Serie $series)
{
    $this->series->removeElement($series);
}

/**
 * Get series
 *
 * @return Doctrine\Common\Collections\Collection 
 */
public function getSeries()
{
    return $this->series;
}
}

ControllerクラスSerieControllerはControllerを拡張します{publicfunctionnewAction(){$ entity = new Serie(); $ form = $ this-> createForm(new SerieType()、$ entity);

    return array(
        'entity' => $entity,
        'form'   => $form->createView(),
    );
}

/**
 * Creates a new Serie entity.
 *
 * @Route("/create", name="serie_create")
 * @Method("POST")
 * @Template("DBBundle:Serie:new.html.twig")
 */
public function createAction(Request $request)
{
    $entity  = new Serie();
    $form = $this->createForm(new SerieType(), $entity);
    $form->bind($request);

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

        return $this->redirect($this->generateUrl('serie_show', array('id' => $entity->getId())));
    }

    return array(
        'entity' => $entity,
        'form'   => $form->createView(),
    );
}
}

そしてフォーム:

class SerieType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('title')
        ->add('start')
        ->add('end')
        ->add('type')
        ->add('status')
        ->add('magazines','entity',array(
                'class' => 'DBBundle:Magazine',
                'multiple' => true,
                'property' => 'name'
                ))
    ;
}

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'MyList\DBBundle\Entity\Serie'
    ));
}

public function getName()
{
    return 'mylist_dbbundle_serietype';
}
}

これについていくつか質問があることは知っていますが(つまり、Symfony2-Doctrine:ManyToManyリレーションはデータベースに保存されません)、それらのどれも私の問題を解決していません。

4

1 に答える 1

2

これは、あなたpersist()がマガジンを一度も取得したことがないためです。フォームは既にエンティティに追加していますが、Doctrine はまだそれを管理する必要があります。

これをに追加しますif ($form->isValid())

...
$magazines = $entity->getMagazines();
foreach($magazines as $magazine){
    $em->persist($magazine);
}
...
$em->flush();
于 2012-11-03T23:51:44.327 に答える