多対多の関連付けに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の間の)関連付けは作成されていません。私は何かを忘れていますか?