Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Symfony - OneToMany como campo select

20 de julio de 2015

Hola,

Os planteo mi duda. Tengo una EntidadA y una EntidadB con una relación OneToMany y ManyToOne respectivamente. Desde la EntidadA puedo obtener todas las EntidadB relacionadas y en EntidadB la EntidadA, si es que tiene asociada alguna.

Pues lo que quiero es que al crear/editar una EntidadA, uno de los campos sea un select multiple que me permita seleccionar una o varias EntidadB. Añado este campo en mi FormType como un campo de tipo entity pero cuando guardo no hace nada. No falla, pero no hace nada. Como aquí somos de código pego parte de lo que tengo y seguro nos entendemos mejor:

...
    /**
     * @var ArrayCollection
     *
     * @ORM\OneToMany(targetEntity="Reader", mappedBy="laundry", cascade={"persist"})
     * @Exclude()
     */
    private $readers;
 
    public function __construct()
    {
        ...
        $this->readers = new ArrayCollection();
    }
...
...
    /**
     * @var Laundry
     *
     * @ORM\ManyToOne(targetEntity="Laundry", inversedBy="readers")
     * @ORM\JoinColumn(name="laundry_id", referencedColumnName="id")
     */
    private $laundry;
...

Por supuesto tiene sus metodos addXXX, removeXXX, getXXX y hasta un setXXX que recibe un ArrayCollection.

De momento lo he solucionado en el controlador, al guardar obtengo todos los readers, reseteo las relaciones y guardo las nuevas relaciones. Funciona, pero estoy seguro de que hay una forma mas elegante y practica, esa es mi duda.

¿Existe alguna forma de hacer lo que busco?. No quiero un formulario embebido ya que no voy a añadir readers, estos se gestionan en otra parte, y ademas por estética prefiero el select.

Gracias.

Un saludo.


Respuestas

#1

No se cómo tienes los métodos Set de las entidades, pero fíjate que tengas bien diseñado el método setReaders() debe ser mas o menos así.

public function setReaders(\Doctrine\Common\Collections\Collection $readers)
{
    $this->readers = $readers;
    foreach ($readers as $reader) {
        $readers->setLaundry($this);
    }
}

No se si esto resuelve tu duda.

Un saludo.

@miguelplazasr

24 julio 2015, 5:31