Doctrine aktualisiert kein einfaches Feld vom Typ Array

Kurzgeschichte (Bearbeiten)

Es ist möglich, ein Array anstelle einer zugeordneten Zuordnung zu speichern. In Symfony2 ist dies mit der ziemlich einfachFeldtyp für Sammlung. Mit dieser Technik können Sie beispielsweise ein Array von Textfeldern speichern, die ein Array-Ereignisfeld füllen. Um ein Array zu aktualisieren, gibt es jedoch einen Trick, den @Vadim Ashikhman in der akzeptierten Antwort wunderbar erklärt.

Lange Geschichte

Manchmal ist es nützlich und effizienter, ein Array anstelle einer zugeordneten Zuordnung zu speichern. Einmal erstellt, bleibt es jedoch kompliziert, dieses Array zu aktualisieren, wenn sich die Größe dieses Arrays nicht ändert.

Viele Menschen haben eineähnliches Problem aber niemand fand eine richtige Lösung für dieses Problem.

Ein Team kann viele Veranstaltungen organisieren. Diese Ereignisse werden einfach mit Doctrine in einem Array gespeichert, anstatt mit einer OneToMany-Zuordnung. Daher wird das Entitätsereignis nicht mit Doctrine zugeordnet.

Entity Event (nicht mit Doctrine abgebildet)
<?php

namespace Acme\TestBundle\Entity;

...

class Event
{

    /**
     * @Assert\NotBlank
     */
    private $name;

    public function setName($name)
    {
        $this->name = $name;
    }

    public function getName()
    {
        return $this->name;
    }


}
Entitätsteam
<?php

namespace Acme\TestBundle\Entity;

...

/**
 * @ORM\Entity()
 * @ORM\HasLifecycleCallbacks
 * @ORM\Table(name="teams")  
 */
class Team 
{

/**
     * @ORM\Column(type="array")
     * @var array
     */
    protected $events;


    public function addEvent($event)
    {
        if (!in_array($event, $this->events, true)) {
            $this->events[] = $event;
        }

        return $this;
    }

    public function removeEvent($event)
    {
        if (false !== $key = array_search($event, $this->events, true)) {
            unset($this->events[$key]);
            $this->events = array_values($this->events);
        }

        return $this;
    }

    public function getEvents()
    {
        return $this->events;
    }

    public function setEvents(array $events)
    {
        $this->events = array();

        foreach ($events as $event) {
            $this->addEvent($event);
        }

        return $this;
    }
Ereignisformular
<?php
namespace Acme\TestBundle\Form\Type;

...

class EventType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        parent::buildForm($builder, $options);

        $builder->add('name', 'text');
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Acme\TestBundle\Entity\Event',
            'cascade_validation' => true,
        ));
    }

    ...
}
Team Form
<?php

namespace Acme\TestBundle\Form\Type;

...

class TeamType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        parent::buildForm($builder, $options);

        $builder->add('events','collection', array(
            'type' => new EventType(),
            'allow_add'   => true,
            'allow_delete' => true,
            'prototype' => true,
            'by_reference' => false,
            'options' => array('data_class' => 'Acme\TestBundle\Entity\Event'),
            )
        );

    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Acme\TestBundle\Entity\Team',
        ));
    }
    ...

}
Der Controller
/**
 * Update a team
 *
 * @Route("update/{team_id}", name="updateTeamFromId")
 * @Template("AcmeTestBundle:Team:teamUpdate.html.twig")
 */
public function updateTeamAction($team_id, Request $request)
{

    $em = $this->getDoctrine()->getManager();

    $repository= $em->getRepository('AcmeTestBundle:Team');

    $team_to_update = $repository->find($team_id);

    $form = $this->createForm(new teamType(), $team_to_update);

    if ($request->getMethod() == 'POST')
    {
        $form->bind($request);

        if ($form->isValid()){

            $em->persist($team_to_update);
            $em->flush();

            return $this->redirect($this->generateUrl('homepage'))  ;
        }
    }

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

}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage