Relacion Muchos a Muchos Doctrine 2

781 views
Skip to first unread message

aasanchez

unread,
Dec 7, 2012, 12:08:57 AM12/7/12
to symfo...@googlegroups.com
Estoy estudiando symfony 2.1 y ahora en un sistema de prueba que estoy haciendo, me ha tocado realizar una relación muchos a muchos entre 2 tablas, las entidades son algo como:

Primera tabla:
<?php
namespace BtSoftware\MenuBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
* @ORM\Entity
* @ORM\Table(name="paciente")
*/
class Paciente{
    /**
    * @ORM\Id
    * @ORM\Column(type="integer")
    * @ORM\GeneratedValue
    */
    protected $id;

    /** @ORM\Column(type="string", length=64) */
    protected $nombre;

    /** @ORM\Column(type="string", length=64) */
    protected $condicion;


Y otra Tabla que podemos definirla como:

<?php
namespace BtSoftware\MenuBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
* @ORM\Entity
* @ORM\Table(name="plato")
*/
class Plato{
    /**
    * @ORM\Id
    * @ORM\Column(type="integer")
    * @ORM\GeneratedValue
    */
    protected $id;

    /** @ORM\Column(type="string", length=64) */
    protected $nombre;

    /** @ORM\Column(type="string", length=64) */
    protected $slug;

    /** @ORM\Column(type="string", length=140) */
    protected $descripcion; 

Estas 2 tablas relacionan pacientes con platos de comida, pero no tengo idea de como hacer una relacion muchos a muchos entre las 2 tablas, pero hay una condicion y es que la tabla intermedia que deberia crear el ORM, debe incluir una propidad adiciona que se llama Observacion, que sera unica en la relacion entre Plato y Paciente, esta contiene las observaciones unicas en caso de existir... 

Alguien podria ayudarme? la verdad estoy algo complicado con esto... 

Absalón Valdés Ormeño

unread,
Dec 7, 2012, 12:58:16 AM12/7/12
to symfony-es
Aqui está muy bien explicado, es lo mismo que la documentación de Doctrine2 pero en español. http://parasitovirtual.wordpress.com/2011/03/12/mapeo-de-relaciones-muchos-a-muchos-many-to-many-en-doctrine-2/


--
Has recibido este mensaje porque estás suscrito al grupo "symfony-es" de Google Groups.
Para publicar en este grupo, envía un email a symfo...@googlegroups.com
Para darte de baja, envía un email a symfony-es+...@googlegroups.com
El resto de opciones puedes encontrarlas en http://groups.google.com/group/symfony-es?hl=es



--
Absalon Valdés Ormeño.
http://es.gravatar.com/absalonvaldes

Marcelo Prizmic

unread,
Dec 7, 2012, 11:14:30 AM12/7/12
to symfo...@googlegroups.com
Si tenés que poner una propiedad ("observacion") entonces no tenés que usar manytomany sino plato -> onetomany -> plato_paciente -> manytoone -> paciente.

Marcelo

aasanchez

unread,
Dec 7, 2012, 12:15:55 PM12/7/12
to symfo...@googlegroups.com
Meck pero eso seria creando yo la entidad plato_paciente? primero y luego haciendo las relaciones onetomany > manytoone

Marcelo Prizmic

unread,
Dec 10, 2012, 8:54:15 AM12/10/12
to symfo...@googlegroups.com
Así es.

Te pego un ejemplo que estoy desarrollando de un sistema para educación

Un establecimiento educativo funciona en uno o más edificios y en un edificio pueden funcionar uno o más establecimientos educativos.

Las clases son las siguientes:

<?php

namespace Fd\EstablecimientoBundle\Entity;

use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Constraints\NotBlank;

use Doctrine\ORM\Mapping as ORM;

/**
 * Fd\EstablecimientoBundle\Entity\Establecimiento
 *
 * @ORM\Table(name="establecimiento")
 * @ORM\Entity(repositoryClass="Fd\EstablecimientoBundle\Repository\EstablecimientoRepository")
 * @ORM\HasLifecycleCallbacks()
 */
class Establecimiento {

    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string $cue
     *
     * @ORM\Column(name="cue", type="string", length=7, nullable=true)
     */
    private $cue;

    /**
     * bidireccional lado inverso
     * @ORM\OneToMany(targetEntity="Fd\EstablecimientoBundle\Entity\EstablecimientoEdificio", mappedBy="establecimientos")
     * @Assert\NotBlank(message="El dato no puede quedar en blanco")
     */
    private $edificio;

    /**
     * @ORM\ManyToOne(targetEntity="Fd\TablaBundle\Entity\TipoEstablecimiento")
     */
    private $tipo_establecimiento;

    /**
     *
     * @ORM\Column(type="string", length=7, nullable=true)
     */
    private $codigo_previo_transferencia;

    /**
     * @var string $nombre
     *
     * @ORM\Column(name="nombre", type="string", length=80, nullable=true)
     */
    private $nombre;

    /**
     * @ORM\Column(length=25, nullable=true)
     */
    private $apodo;

    /**
     * @var string $numero
     *
     * @ORM\Column(name="numero", type="integer", length=2, nullable=true)
     */
    private $numero;

    /**
     * @ORM\Column(name="orden", type="integer", length=2, nullable=true)
     */
    private $orden;

    /**
     * @var string $descripcion
     *
     * @ORM\Column(name="descripcion", type="string", length=15, nullable=true)
     */
    private $descripcion;

    /**
     *
     * @ORM\Column(type="date", nullable=true)
     */
    private $fecha_creacion;

    /**
     *
     * @ORM\Column(name="tiene_cooperadora", type="boolean", nullable=true)
     */
    private $tiene_cooperadora;

    /**
     * @var string $url
     *
     * @ORM\Column(name="url", type="string", length=255, nullable=true)
     */
    private $url;

    /**
     * @var string $url
     *
     * @ORM\Column(nullable=true)
     * @Assert\Email()
     */
    private $email;
    /**
     * @ORM\ManyToOne(targetEntity="Fd\TablaBundle\Entity\CargoAutoridad")
     */
    private $cargo_autoridad;
    /**
     * @ORM\Column(nullable=true)
     */
    private $nombre_autoridad;
    /**
     *
     * @ORM\ManyToOne(targetEntity="Fd\TablaBundle\Entity\DistritoEscolar")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="distrito_escolar_id", referencedColumnName="id")
     * })
     */
    private $distrito_escolar;

    /**
     * @ORM\ManyToOne(targetEntity="Fd\TablaBundle\Entity\Sector")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="sector_id", referencedColumnName="id")
     * })
     */
    private $sector;

    /**
     * bidireccional lado inverso
     * @ORM\OneToMany(targetEntity="Fd\EstablecimientoBundle\Entity\UnidadEducativa", mappedBy="establecimiento")
     */
    private $unidades_educativas;

    /**
     * bidireccional lado inverso
     * @ORM\OneToMany(targetEntity="Fd\EstablecimientoBundle\Entity\Autoridad", mappedBy="establecimiento")
     */
    private $autoridades_rectorado;




<?php

namespace Fd\EdificioBundle\Entity;


use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Constraints\NotBlank;
use Fd\EdificioBundle\Entity\Domicilio;

/**
 * @ORM\Table(name="edificio")
 * @ORM\Entity(repositoryClass="Fd\EdificioBundle\Repository\EdificioRepository")
 */
class Edificio {

    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var integer $cui
     *
     * @ORM\Column(name="cui", type="integer", nullable=true, unique=true)
     */
    private $cui;

    /**
     * bidireccional lado inverso
     * @ORM\OneToMany(targetEntity="Fd\EstablecimientoBundle\Entity\EstablecimientoEdificio", mappedBy="edificios")
     */
    private $establecimiento;

    /**
     * @var integer $superficie
     *
     * @ORM\Column(name="superficie", type="integer", nullable=true)
     */
    private $superficie;

    /**
     * @var Comuna
     *
     * @ORM\ManyToOne(targetEntity="Fd\TablaBundle\Entity\Comuna")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="comuna_id", referencedColumnName="id")
     * })
     */
    private $comuna;

    /**
     * @var Cgp
     *
     * @ORM\ManyToOne(targetEntity="Fd\TablaBundle\Entity\Cgp")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="cgp_id", referencedColumnName="id")
     * })
     */
    private $cgp;

    /**
     * @var Barrio
     *
     * @ORM\ManyToOne(targetEntity="Fd\TablaBundle\Entity\Barrio")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="barrio_id", referencedColumnName="id")
     * })
     */
    private $barrio;

    /**
     * @var DistritoEscolar
     *
     * @ORM\ManyToOne(targetEntity="Fd\TablaBundle\Entity\DistritoEscolar")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="distrito_escolar_id", referencedColumnName="id")
     * })
     */
    private $distritoEscolar;

    /**
     * bidireccional lado inverso
     * @ORM\OneToMany(targetEntity="Fd\EdificioBundle\Entity\Domicilio", mappedBy="edificio")
     */
    private $domicilios;




<?php

namespace Fd\EstablecimientoBundle\Entity;


use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Constraints\NotBlank;

/**
 * Fd\EstablecimientoBundle\Entity\EstablecimientoEdificio
 *
 * @ORM\Table(name="establecimiento_edificio")
 * @ORM\Entity
 */
class EstablecimientoEdificio
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;
    /**
     * bidireccional lado propietario
     * @ORM\ManyToOne(targetEntity="Fd\EstablecimientoBundle\Entity\Establecimiento", inversedBy="edificio")
     * @Assert\NotBlank(message="El dato no puede quedar en blanco")
     */
    private $establecimientos;
    /**
     * bidireccional lado propietario
     * @ORM\ManyToOne(targetEntity="Fd\EdificioBundle\Entity\Edificio", inversedBy="establecimiento")
     * @Assert\NotBlank(message="El dato no puede quedar en blanco")
     */   
    private $edificios;
    /**
     * @ORM\OneToMany(targetEntity="Fd\EstablecimientoBundle\Entity\Localizacion", mappedBy="establecimiento_edificio")
     * bidireccional lado inverso
     */
    private $localizacion;
    /**
     * @ORM\Column(name="cue_anexo", type="string", length=2, nullable=false)
     */
    private $cue_anexo;
    /**
     * @var string $nombre
     *
     * @ORM\Column(name="nombre", type="string", length=50, nullable=true)
     */
    private $nombre;
    /**
     *
     * @ORM\Column(type="date", nullable=true)
     */
    private $fecha_creacion;
    /**
     *
     * @ORM\Column(type="date", nullable=true)
     */
    private $fecha_baja;
Reply all
Reply to author
Forward
0 new messages