Symfony2 - 创建关联的表单出错(多对多)

时间:2012-10-19 08:13:41

标签: forms symfony many-to-many

我在多对多关联中有2个实体。

/**
 * @ORM\Table()
 * @ORM\Entity()
 */
class Clown
{
    ...
    /**
     * @ORM\ManyToMany(targetEntity="Appuntamento", inversedBy="partecipanti")
     * @ORM\JoinTable(name="partecipa")
     */
    private $appuntamenti;

    public function __construct() {
        $this->appuntamenti = new ArrayCollection();
    }
    ...
    public function addAppuntamenti(Appuntamento $app)
    {
        $this->appuntamenti[] = $app;
    }    

    public function getAppuntamenti()
    {
        return $this->appuntamenti;
    }
}

/**
 * @ORM\Table()
 * @ORM\Entity()
 */
class Appuntamento
{
    /**
     * @ORM\ManyToMany(targetEntity="Clown", mappedBy="appuntamenti")
     */
    private $partecipanti;

    public function __construct() {
        $this->partecipanti = new ArrayCollection();
    }
    ...
    public function addPartecipanti(Clown $partecipante)
    {
        $partecipante->addAppuntamenti($this);
        $this->partecipanti[] = $partecipante;
    }    

    public function getPartecipanti()
    {
        return $this->partecipanti;
    }
}

然后我创建一个表单,允许设置Appuntamento的与会者(又名“partecipanti”)。

namespace Clown\DiaryBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;

class PartecipantiType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder
            ->add('title')  
            ->add('partecipanti', 'entity', array(
                    'class' => 'ClownDiaryBundle:Clown',
                    'property' => 'drname',
                    'multiple'  => true,
                    'expanded'  => true,
            ))
        ;
    }

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

现在在控制器中我创建了一个动作,一个显示表单,一个更新实体。

/**
 * @Route("/{id}/partecipanti", name="admin_appuntamento_partecipanti")
 * @Template()
 */
public function partecipantiAction($id)
{
    $em = $this->getDoctrine()->getEntityManager();

    $entity = $em->getRepository('ClownDiaryBundle:Appuntamento')->find($id);

    if (!$entity) {
        throw $this->createNotFoundException('Unable to find Appuntamento entity.');
    }

    $partecipantiForm = $this->createForm(new PartecipantiType(), $entity);

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

/**
 * @Route("/{id}/update_partecipanti", name="admin_appuntamento_update_partecipanti")
 * @Method("post")
 * @Template("ClownDiaryBundle:Appuntamento:partecipanti.html.twig")
 */
public function updatePartecipantiAction($id)
{
    $em = $this->getDoctrine()->getEntityManager();

    $entity = $em->getRepository('ClownDiaryBundle:Appuntamento')->find($id);

    if (!$entity) {
        throw $this->createNotFoundException('Unable to find Appuntamento entity.');
    }

    $partecipantiForm = $this->createForm(new PartecipantiType(), $entity);
    $request = $this->getRequest();
    $partecipantiForm->bindRequest($request);

    if ($partecipantiForm->isValid()) {
        $em->persist($entity);
        $em->flush();

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

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

但是当我在第二个动作中得到帖子,并且我试图坚持该对象时,没有创建任何关联(Clown和Appuntamento之间)。 我忘记了什么吗?

1 个答案:

答案 0 :(得分:0)

你应该通过拥有方来坚持你的实体(拥有方负责坚持)。在你的情况下,拥有方是小丑,但你正试图通过Appuntamento坚持 - 这就是为什么它不会持续存在。

尝试更改拥有方或通过Clown实体持续存在。

您可能还想了解更多关于拥有/反向概念的信息: