Doctrine 2 relacion muchos a muchos en tabla separada.

1,241 views
Skip to first unread message

migk

unread,
Feb 28, 2013, 6:51:57 AM2/28/13
to symfo...@googlegroups.com
Hola a todos tengo una duda que me lleva comiendo unos días.Tengo una relación muchos a muchos (CompraProducto) y e tenido que crear la clase de la relacion debido a que ademas de primary key necesito almacenar atributos tales como la cantidad y la fecha. 

class CompraProducto
{

/**
* @ORM\Id
* @ORM\ManyToOne(targetEntity="Almacen\FrontendBundle\Entity\Compra")
*/
protected $compra;


/**
* @ORM\Id
* @ORM\ManyToOne(targetEntity="Almacen\FrontendBundle\Entity\Producto")
*/
protected $producto;


/**
* @var integer
*
* @ORM\Column(name="cantidad", type="integer")
*/
protected $cantidad;

/**
* @ORM\Column(type="datetime")
*/
protected $fecha;

Me he guiado por el tutorial de la aplicacion cupon y es que tengo que hacer lo mismo, el problema viene que cuando trato de modificar la tabla como en la carga de los fixtures me da el siguiente el error:

ORMException
Entity of type Almacen\FrontendBundle\Entity\CompraProducto is missing an a assigned ID for field 'compra'. The identifier generation strategy for this entity requires the ID field to be populated before EntityManager#persist() is called. If you want automatically generated identifiers instead you need to adjust the metadata mappping accordingly.

Cuando persisto los datos me salta el error, la verdad es que no tengo ni zorra idea, porque en la documentacion de doctrine 2 lo que aparece es como hacer una tabla muchos a muchos sin tener que crear la tabla intermedia de la relacion pero no es mi caso ya que necesito almacenar informacion extra ( cantidad y fecha ) y eso me obliga a crear la tabla.



Jose Molet

unread,
Feb 28, 2013, 8:30:00 AM2/28/13
to symfo...@googlegroups.com
Buenos dias migk
creo que puedes solucionar eso creando tu aparte tu la entity CompraProducto,
suponiendo que tienes la entidad Compra, y Producto entonces tu entidad CompraProducto seria la relacion asi:
Compra   1  ----> n CompraProducto
Producto 1  ----> n CompraProducto
eso te daria un relacion entre compra y producto
Compra   n------>n  Producto
Asi puedes agregar en CompraProducto cualquier otro Atributo que necesites
espero te sirva de ayuda
.







--
--
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
 
---
Has recibido este mensaje porque estás suscrito al grupo "symfony-es" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a symfony-es+...@googlegroups.com.
Para obtener más opciones, visita https://groups.google.com/groups/opt_out.
 
 

Roberto Moreno P.

unread,
Feb 28, 2013, 8:33:04 AM2/28/13
to symfo...@googlegroups.com
Estimado,

Revise

http://docs.doctrine-project.org/en/2.0.x/reference/association-mapping.html#many-to-many-bidirectional

Saludos
> --
> --
> 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
>
> ---
> Has recibido este mensaje porque estás suscrito al grupo "symfony-es" de
> Grupos de Google.
> Para anular la suscripción a este grupo y dejar de recibir sus correos
> electrónicos, envía un correo electrónico a
> symfony-es+...@googlegroups.com.
> Para obtener más opciones, visita https://groups.google.com/groups/opt_out.
>
>



--
Roberto Andrés Moreno Pérez

migk

unread,
Feb 28, 2013, 8:54:46 AM2/28/13
to symfo...@googlegroups.com
  Hola Jose, precisamente eso es lo que hago, creo una tabla intermedia para Compra   n------>n  Producto para poder almacenar la cantidad y la fecha pero no me va. :(.
¿ Nadie de verdad ha tenido que hacer lo que yo estoy intentando  ?  



.


migk

unread,
Feb 28, 2013, 8:59:01 AM2/28/13
to symfo...@googlegroups.com, rmo...@gmail.com
Hola Roberto, esta forma no me sirve ya que necesito crear la tabla intermedia ya que tengo que guardar datos extras ( la cantidad y la fecha).

 

Jose Molet

unread,
Feb 28, 2013, 9:12:35 AM2/28/13
to symfo...@googlegroups.com
bueno yo le eh creado como te dije
suponiendo
tengo tablas
class Producto{

/**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
protected $id;

/**
     * @ORM\Column(type="string", length=30, unique=true)
     */
protected $codigo;

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

/**
     * @ORM\Column(type="integer", length=30, unique=true)
     */
protected $cantidad;

//la relacion con CompraProducto

/**
     * @ORM\OneToMany(targetEntity="CompraProducto", mappedBy="producto")
     */
protected $compraprod;
}

class Compra{

/**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
protected $id;

//esta tambien deberia ser una relacion

/**
     * @ORM\Column(type="string", length=30, unique=true)
     */
protected $cliente;

/**
     * @ORM\OneToMany(targetEntity="CompraProducto", mappedBy="compra")
     */
protected $compraprod;

}

class CompraProducto{
//opcional
/**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
protected $id;

//relacion con compra
 /**
     * @ORM\ManyToOne(targetEntity="Compra", inversedBy="compraprod")
     * @ORM\JoinColumn(name="compra_id", referencedColumnName="id")
     */
protected $compra;

//relacion con producto
 /**
     * @ORM\ManyToOne(targetEntity="Producto", inversedBy="comrpaprod")
     * @ORM\JoinColumn(name="producto_id", referencedColumnName="id")
     */
protected $producto;

// aqui van las otras variables que desees
.
.
.
.
//
}

de esa forma obtines la relacion muchos a muchos con compra - pruducto y puedes declarar tu otras variables o mejor dicho campos


El 28 de febrero de 2013 09:29, migk <gtan...@gmail.com> escribió:
Hola Roberto, esta forma no me sirve ya que necesito crear la tabla intermedia ya que tengo que guardar datos extras ( la cantidad y la fecha).


 

--

migk

unread,
Mar 1, 2013, 8:02:17 AM3/1/13
to symfo...@googlegroups.com
Muchisimas gracias Jose ya lo he resuelto, el dia que llegue a dominar el symfony ayudare en todo lo que pueda.



CesarCF

unread,
May 22, 2014, 2:06:35 PM5/22/14
to symfo...@googlegroups.com
Hola!,
yo estoy en la misma situacion que tu.
Lo solucionaste como te ponia Jose Molet, creando directamente la tabla intermedia como una Entity?

Saludos!

Marcelo Prizmic

unread,
May 23, 2014, 5:04:50 PM5/23/14
to symfo...@googlegroups.com
También tuvo esa cuestión y lo soucioné tal como dicen creando la entidad intermedia.
la cuestión a tener en cuenta es que doctrine sólo actualiza el lado propietario de las bidireccionales. Los lado inversos requieren un poco más de lógica que la tiene que hacer el programador, tanto en la entity como en el controller (o donde hagas el persist).
si no escribes esa lógica puede o no funcionar dependiendo de si estás invocando a la relación desde el lado propietario o no.
en la documentación de symfony está explicado.

marcelo


--
--
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

---
Has recibido este mensaje porque estás suscrito al grupo "symfony-es" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a symfony-es+...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Reply all
Reply to author
Forward
0 new messages