1

多対多の関連付けに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(),
    );
}

しかし、2番目のアクションで投稿を取得し、オブジェクトを永続化しようとすると、(ClownとAppuntamentoの間の)関連付けは作成されていません。私は何かを忘れていますか?

4

1 に答える 1

0

所有者側を通じてエンティティを永続化する必要があります(所有者側が永続化する責任があります)。あなたの場合、所有側はピエロですが、Appuntamentoを介して永続化しようとしています-それが永続化しない理由です。

所有側を変更するか、Clownエンティティを介して永続化してみてください。

所有/逆サイドの概念についてももっと読みたいと思うかもしれません:

于 2012-10-19T09:26:18.310 に答える