Foros del Web » Programando para Internet » PHP » Symfony »

Insertar datos en entidades vinculadas Symfony 2

Estas en el tema de Insertar datos en entidades vinculadas Symfony 2 en el foro de Symfony en Foros del Web. Hola! Estoy hace tiempo intentando realizar un simple insert en una de dos entidades relacionadas Many to One y no consigo lograrlo. Les comento un ...
  #1 (permalink)  
Antiguo 22/08/2012, 09:01
Avatar de verinchi  
Fecha de Ingreso: septiembre-2004
Ubicación: Buenos Aires
Mensajes: 647
Antigüedad: 20 años, 2 meses
Puntos: 2
Insertar datos en entidades vinculadas Symfony 2

Hola!
Estoy hace tiempo intentando realizar un simple insert en una de dos entidades relacionadas Many to One y no consigo lograrlo.
Les comento un poco las etapas por las que he pasado.

Primeramente, mis entidades están definidas y relacionadas de la siguiente manera:

La primera contiene tipos de pasajes
Código PHP:
class tipoPasaje
{
    
/**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    
private $id;
    
    
/**
     * @ORM\OneToMany(targetEntity="Pasaje", mappedBy="codTipopas") 
     */
    
protected $aPasaje;
    public function 
__construct()
    {
        
$this -> aPasaje = new ArrayCollection();
    }
  .... 
mas campos

La segunda, contiene los pasajes en sí, en los cuales una columna está destinada a definir su tipo

Código PHP:
class Pasaje
{
    
/**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    
private $id;

.........

/**
     * @var integer $cdTipopas
     *
     * @ORM\Column(name="cdTipopas", type="integer")
     * @return integer
     */
    
private $cdTipopas;
    
    public function 
setTipopas(tipoPasaje $cdTipopas)
    {
        
$this -> cdTipopas $cdTipopas;
    }
    public function 
getTipopas()
    {
        return 
$this -> cdTipopas;
    }
    
    
/**
     * @ORM\ManyToOne(targetEntity="tipoPasaje", inversedBy="aPasaje")
     *  @ORM\JoinColumn(name="cdTipopas", referencedColumnName="id") 
     */
    
protected $codTipopas;
....


Luego, al momento de insertar un pasaje en el controlador, dado que en este caso es conocido previamente el código de tipo de pasaje, intenté hacerlo con:

Código PHP:
$pasaje->setTipopas(1); 
Pero obtuve un mensaje de error advirtiendo que a esa columna debería pasarle un objeto en lugar de un entero.

Entonces, probé con la siguiente solución:
Código PHP:
$ip=$this->getDoctrine()->getEntityManager();
... 
asignaciones varias a otras columnas
$pasaje
->setTipopas($ip->getReference('pasajesBundle:tipoPasaje','1'));
... 
otras asignaciones

$ip
->persist($pasaje);
$ip->flush(); 
Y ahora me da el siguiente error:
ORA-01400: no se puede realizar una inserción NULL en ("UTN_DES"."PASAJE"."CDTIPOPAS")

Lo que me indica obviamente, que el objeto que estoy intentando referenciar con getReference no carga nada.

Cabe aclarar que, en la base de datos, el objeto contiene dos datos, con id 1 y 2 respectivamente. Con lo que la referencia a 1 debería existir.

Sigo buscando información pero realmente estoy desorientada... Obviamente, en algo me estoy equivocando, pero no encuentro en qué .

Alguno de ustedes podrá ayudarme a encontrar este error?

Desde ya, mil gracias a todos!
__________________
Why can't we not be sober?
www.partitorium.com.ar
  #2 (permalink)  
Antiguo 22/08/2012, 09:34
Avatar de Ribon  
Fecha de Ingreso: septiembre-2010
Ubicación: El firmamento
Mensajes: 487
Antigüedad: 14 años, 2 meses
Puntos: 91
Respuesta: Insertar datos en entidades vinculadas Symfony 2

Lo que pasa es que en la definición de tu Entity Pasaje para el campo foráneo que incluye el tipoPasaje pusiste el nombre $cdTipoPass, lo que te produce problemas es que en el Entity TipoPasaje el grupo de pasajes ($aPasaje) apunta a un atributo que no existe en Pasaje, pues lo definiste así

Código PHP:
Ver original
  1. /*
  2. * @ORM\OneToMany(targetEntity="Pasaje", mappedBy="codTipopas")
  3. */

el problema está en el mappedBy="codTipopas" que debería ser mappedBy="cdTipoPass"

Saludos.
__________________
Utilice el Highlight para mostrar código, mis ojos se lo agradecerán :)
qué es esto? :O -> http://i48.tinypic.com/5x3kzs.png
Ya sabes :)
  #3 (permalink)  
Antiguo 22/08/2012, 09:46
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 10 meses
Puntos: 845
Respuesta: Insertar datos en entidades vinculadas Symfony 2

@verinchi, te sugiero que sigas la convenciones que utiliza el fw para nombrar las clases y sus atributos, no estas trabajando con tablas de una bbdd son entidades.

pasajesBundle = PasajeBundle
tipoPasaje = TipoPasaje

$aPasaje = $pasaje
$codTipopas = $tipoPasaje

Luego, porque mapeas cdTipopas ?, esta mapeado en codTipopas.

También te sugiero que te familiarices con el concepto de Owning Side and Inverse Side http://doctrine-orm.readthedocs.org/...n-mapping.html

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #4 (permalink)  
Antiguo 22/08/2012, 11:34
Avatar de verinchi  
Fecha de Ingreso: septiembre-2004
Ubicación: Buenos Aires
Mensajes: 647
Antigüedad: 20 años, 2 meses
Puntos: 2
Respuesta: Insertar datos en entidades vinculadas Symfony 2

Hola Ribon, masterpuppet, gracias por sus comentarios. Ciertamente soy muy junior en esto

Intenté haciendo los cambios que sugirieron y me quedó:

Código PHP:
class tipoPasaje
{
    
/**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    
private $id;
    
    
/**
     * @ORM\OneToMany(targetEntity="Pasaje", mappedBy="cdTipopas") 
     */
    
protected $Pasaje;
    public function 
__construct()
    {
        
$this -> Pasaje = new ArrayCollection();
    }

...

/**
     * Add aPasaje
     *
     * @param Pasaje
     */
    
public function addPasaje($Pasaje)
    {
        
$this->Pasaje[] = $Pasaje;
    }

    
/**
     * Get aPasaje
     *
     * @return Doctrine\Common\Collections\Collection 
     */
    
public function getAPasaje()
    {
        return 
$this->Pasaje;
    }
}

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

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

    
/**
     * @var integer $cdTipopas
     * @ORM\Column(name="cdTipopas", type="integer")
     * @ORM\ManyToOne(targetEntity="tipoPasaje", inversedBy="Pasaje")
     * @ORM\JoinColumn(name="cdTipopas", referencedColumnName="id")
     * @return integer
     */
    
private $cdTipopas;


Los getters y setters para Pasaje:
Código PHP:
/**
     * Set cdTipopas
     *
     * @param integer $cdTipopas
     */
    
public function setcdTipopas(tipoPasaje $cdTipopas)
    {
        
$this->cdTipopas $cdTipopas;
    }

    
/**
     * Get cdTipopas
     *
     * @return integer 
     */
    
public function getCdTipopas()
    {
        return 
$this->cdTipopas;
    } 
Luego en el controlador
Código PHP:
$ip=$this->getDoctrine()->getEntityManager();
$pasaje->setcdTipopas($ip-> getReference('pasajesBundle:tipoPasaje'1)); 
Al intentar guardar, ahora el error cambia por este:

Invalid variable used for bind', 'C:\xampp\htdocs\Symfony\vendor\doctrine-dbal\lib\Doctrine\DBAL\Driver\OCI8\OCI8Statement.p hp', '112', array('column' => ':param3', 'variable' => object(tipoPasaje), 'type' => '1'))

Perdón por las incoherencias de acuerdo a las convenciones, ya me iré acostumbrando y mejorando mis definiciones de objetos.

Nuevamente, no se dónde la estoy pifiando
__________________
Why can't we not be sober?
www.partitorium.com.ar

Etiquetas: entidades, vinculadas
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:23.