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

Relación ManyToMany con atributos extras en formulario

3 de octubre de 2017

Hola,

Estoy con un proyecto que tiene un sistema de avisos y estos van dirigidos a N usuarios, por lo que tengo una tabla intermedia los ids del mensaje y el usuario al que va dirigido, pero como necesito saber si lo ha leido y cuando, pues esta tabla intermedia es otra entidad y hago las relaciones entre ellas. La cuestión es que el formulario de crear aviso debe tener un select multiple con los usuarios y el resto de campos de la entidad Notice, como son el asunto, contenido y una fecha de envio (opcional). El problema es que esa relación con usuario no existe, si no que es con la entidad NoticeUser. ¿Como podría hacer para mostrar ese listado de usuarios y que me mantenga esa relación?. Actualmente tengo algo asi:

/**
 * @ORM\Entity()
 * @ORM\Table(name="notices")
 */
class Notice
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;
 
    /**
     * @var string
     *
     * @ORM\Column(name="subject", type="string", length=255)
     */
    private $subject;
 
    /**
     * @var string
     *
     * @ORM\Column(name="content", type="text")
     */
    private $content;
 
    /**
     * @var ArrayCollection
     *
     * @ORM\OneToMany(targetEntity="AppBundle\Entity\NoticeUser", mappedBy="notice", cascade={"persist", "remove"}, orphanRemoval=true)
     */
    private $recipients;
 
    public function __construct()
    {
        ...
        $this->questions = new ArrayCollection();
    }
 
    ...
}
/**
 * @ORM\Entity()
 * @ORM\Table(name="notices_users")
 */
class NoticeUser
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;
 
    /**
     * @var Notice
     *
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Notice", inversedBy="recipients")
     * @ORM\JoinColumn(name="notice_id", referencedColumnName="id", onDelete="CASCADE")
     */
    private $notice;
 
    /**
     * @var User
     *
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\User")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id", onDelete="CASCADE")
     */
    private $user;
 
    /**
     * @var bool
     *
     * @ORM\Column(name="readed", type="boolean")
     */
    private $readed;
 
    /**
     * @var DateTime
     *
     * @ORM\Column(name="readed_at", type="datetime", nullable=true)
     */
    private $readedAt;
 
    ...
}

Es mas o menos así, no hagáis caso si hay errores typo o alguna relación que no este del todo bien puesto que lo he escrito de memoria, no tengo el código delante.

Ahora mismo lo que hago es en el formulario NoticeType es mostrar el campo recipients como un EntityType multiple de tipo User y en el controlador recorro todos los usuarios y mediante el método addRecipient le voy creando la relación correcta, pero no se si es la mejor manera.

A ver si podéis arrojar algo de luz sobre mi jeje.

Gracias.

Un saludo.