Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Doctrine cascade persist

Estas en el tema de Doctrine cascade persist en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Buenas, No se que estoy haciendo mal para que me guarde siempre null en el campo alerta de la tabla patrones. Código PHP: /* Entities*/ class  ...
  #1 (permalink)  
Antiguo 17/03/2014, 14:24
Avatar de cluster28  
Fecha de Ingreso: enero-2008
Ubicación: Donostia - San Sebastián
Mensajes: 756
Antigüedad: 16 años, 11 meses
Puntos: 32
Doctrine cascade persist

Buenas,

No se que estoy haciendo mal para que me guarde siempre null en el campo alerta de la tabla patrones.

Código PHP:

/* Entities*/

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

    
/**
     * @ORM\OneToMany(targetEntity="Patron", mappedBy="alerta", cascade={"persist", "remove"})
     */
    
private $patrones;

    ...

}

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

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

    
/**
     * @ORM\ManyToOne(targetEntity="Alerta", inversedBy="patrones")
     * @ORM\JoinColumn(name="alerta", referencedColumnName="id")
     */
    
private $alerta;

    ...


Y para guardar la alerta y el patrón a la vez hago

Código PHP:
$patron = new Patron();
$patron->setPatron("blablabla");

$alerta = new Alerta();
$alerta->addPatron($patron);

$em->persist($alerta);
$em->flush(); 
La alerta la inserta bien pero el patrón no.

Código SQL:
Ver original
  1. INSERT INTO patrones (patron, alerta)
  2. VALUES
  3.   (?, ?)
  4.  
  5. Parameters: { 1: blablabla, 2: NULL }
  #2 (permalink)  
Antiguo 17/03/2014, 14:57
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 11 meses
Puntos: 845
Respuesta: Doctrine cascade persist

Te sugiero que leas sobre Owning Side and Inverse Side

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #3 (permalink)  
Antiguo 18/03/2014, 02:12
Avatar de cluster28  
Fecha de Ingreso: enero-2008
Ubicación: Donostia - San Sebastián
Mensajes: 756
Antigüedad: 16 años, 11 meses
Puntos: 32
Respuesta: Doctrine cascade persist

Vale, entonces como este campo es el owner side ...

Código PHP:
   /**
     * @ORM\ManyToOne(targetEntity="Alerta", inversedBy="patrones")
     * @ORM\JoinColumn(name="alerta", referencedColumnName="id")
     */
    
private $alerta
Si guardo $patron me guardaría automática y correctamente $alerta?

Pero si tengo varios 'patrones', debería guardar todos los patrones y se crearía una sola fila de 'alerta', es correcto?

Gracias.
  #4 (permalink)  
Antiguo 18/03/2014, 04:42
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 11 meses
Puntos: 845
Respuesta: Doctrine cascade persist

Doctrine solo comprueba el owning side, lo que a nivel de codigo se traduce en algo asi:

Código PHP:
Ver original
  1. public function addPattern(PatternInterface $pattern)
  2. {
  3.     if($this->patterns->contains($pattern)) {
  4.         throw now DomainException('...');
  5.     }
  6.     $pattern->setAlert($this);//update owning side
  7.     $this->patterns->add($pattern);  
  8. }

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #5 (permalink)  
Antiguo 18/03/2014, 05:25
Avatar de cluster28  
Fecha de Ingreso: enero-2008
Ubicación: Donostia - San Sebastián
Mensajes: 756
Antigüedad: 16 años, 11 meses
Puntos: 32
Respuesta: Doctrine cascade persist

Cita:
Iniciado por masterpuppet Ver Mensaje
Doctrine solo comprueba el owning side
No entiendo.

Tengo el owner side que es la entidad patron y el inverse side que es alerta.

Cómo debería prodecer para guardar las entidades si tengo un objeto alerta con varios patrones añadidos. Guardando sólo la alerta ya veo que no funciona. Entonces, tengo que guardar los patrones uno a uno y se creará la fila de la alerta?

Código PHP:

$alerta 
= new Alerta();

$patron1 = new Patron();
$patron1->setPatron('string1');

$patron2 = new Patron();
$patron2->setPatron('string2');

$alerta->addPatron($patron1);
$alerta->addPatron($patron2);

...

$em->persist(????);
$em->flush(); 
Gracias masterpuppet.
  #6 (permalink)  
Antiguo 18/03/2014, 07:00
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 11 meses
Puntos: 845
Respuesta: Doctrine cascade persist

Al ser patron el owner side tienes que actualizar precisamente de ese lado la relación, en codigo se traduce en algo similar a mi post anterior, simplemente en el addPatern de Alert actualiza Pattern

Código PHP:
Ver original
  1. public function addPattern(PatternInterface $pattern)
  2. {
  3.     ...
  4.     $pattern->setAlert($this);//update owning side
  5.     ...
  6. }

Luego lo utilizas tal cual lo tienes tu, lo has intentado como te comente ?
__________________
http://es.phptherightway.com/
thats us riders :)
  #7 (permalink)  
Antiguo 18/03/2014, 07:57
Avatar de cluster28  
Fecha de Ingreso: enero-2008
Ubicación: Donostia - San Sebastián
Mensajes: 756
Antigüedad: 16 años, 11 meses
Puntos: 32
Respuesta: Doctrine cascade persist

Cita:
Iniciado por masterpuppet Ver Mensaje

Código PHP:
Ver original
  1. public function addPattern(PatternInterface $pattern)
  2. {
  3.     ...
  4.     $pattern->setAlert($this);//update owning side
  5.     ...
  6. }
Es que no se a qué viene este método y de dónde sale PatternInterface... Puede ser que el tema de la cascada sea bastante más complejo de lo que pienso que es y me faltan conceptos de Doctrine...
  #8 (permalink)  
Antiguo 18/03/2014, 08:18
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 11 meses
Puntos: 845
Respuesta: Doctrine cascade persist

No tomes el codigo de forma literal..., simplemente actualiza la referencia en tu addPatron,

Código PHP:
Ver original
  1. public function addPatron(Patron $p)
  2. {
  3.     $p->setAlerta($this);
  4.     $this->patrones->add($p);
  5. }
__________________
http://es.phptherightway.com/
thats us riders :)
  #9 (permalink)  
Antiguo 18/03/2014, 11:35
Avatar de cluster28  
Fecha de Ingreso: enero-2008
Ubicación: Donostia - San Sebastián
Mensajes: 756
Antigüedad: 16 años, 11 meses
Puntos: 32
Respuesta: Doctrine cascade persist

Cita:
Iniciado por masterpuppet Ver Mensaje
No tomes el codigo de forma literal..., simplemente actualiza la referencia en tu addPatron,

Código PHP:
Ver original
  1. public function addPatron(Patron $p)
  2. {
  3.     $p->setAlerta($this);
  4.     $this->patrones->add($p);
  5. }
Con esto va perfecto. Muchas gracias.

Etiquetas: cascade, doctrine, symfony
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:39.