DataFixtures Problemas al usar método find() del objeto ObjectManager

153 views
Skip to first unread message

José Gabriel González

unread,
Jul 4, 2012, 9:35:27 PM7/4/12
to symfo...@googlegroups.com
Al tratar de cargar unos fixtures me he encontrado con un problemita, los fixtures, les dejo a continuación un código de mi fixture persona y la verdad es que no he encontrado un ejemplo que haga lo que yo quiero haces. Les cuento que tengo ya una tabla llenisima con todos los paises del mundo y obviamente su entidad "paises" (y el Id 233 es de Venezuela), resulta que deseo crear un conjunto de "personas" y resulta que al tratar de hacer un find en el Fixture no me devuelve una instancia de la entidad pais que es parte de la entrada del setPais de la entidad "personas"

<?php

namespace Expidian\GlobalBundle\
DataFixtures\ORM;

use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;
use Expidian\GlobalBundle\Entity\Personas;
use Expidian\GlobalBundle\Entity\Paises;

/**
 * Description of UsuariosFixtures
 *
 * @author jgabrielsinner10
 */
class PersonasFixtures extends AbstractFixture implements OrderedFixtureInterface {
   
    public function load(ObjectManager $manager) {
       
        $er = $manager->getRepository("ExpidianGlobalBundle:Paises");
        $pais_obj = $er->find(233);
       
        //var_dump("\n--$pais_obj--\n");
       
        $nombres = array('José', 'María', 'Leonel', 'Gabriel', 'Ignacio', 'Daniel', 'Daniel', 'Ricardo', 'Rosbely', 'Andreina');
        $apellidos = array('Espinoza', 'Hernández', 'Perez', 'Pirela', 'Pulido','Vargas', 'Lozada', 'Mata', 'Silva', 'Bolívar');
       
        for ($i=0;$i<=35;$i++){
            $personas[$i] = new Personas();
            $persona_obj = $personas[$i];
            $aleatorio = mt_rand(0,9);
            $persona_obj->setNombre($nombres[$aleatorio]);
            $persona_obj->setApellido($apellidos[mt_rand(0,9)]);
            $persona_obj->setCedulaDeIdentidad('123456'.$i);
            $persona_obj->setNacionalidad('V');
            $persona_obj->setPais($pais_obj);
            $persona_obj->setEmail($nombres[$aleatorio].$i.'@hotmail.com');
            $persona_obj->setTelefono1('2125555555');
            $manager->persist($persona_obj);
            $this->addReference('persona-'.$i, $persona_obj);
        }
       
        $manager->flush();
       
    }

    public function getOrder() {
        return 1;
    }
   
}

?>

este código me arroja el siguiente error:

[ErrorException]

  Catchable Fatal Error: Argument 1 passed to Expidian\GlobalBundle\Entity\
Personas::setPais() must be an instance of Expidian\GlobalBundle\Entity\Paises, null given, called in C:\wamp\www\expidian\src\Expidian\GlobalBundle\DataFixtures\ORM\PersonasFixtures.php on line 38 and defined in C:\wamp\www\expidian\src\Expidian\GlobalBundle\Entity\Personas.php line 265

Danny alfonzo Viana perez

unread,
Jul 6, 2012, 11:22:10 AM7/6/12
to symfo...@googlegroups.com
tienes un problemita, te indico:

si tu entidad la invocas con
use Expidian\GlobalBundle\Entity\Paises; 

quiere decir que tu estructura de archivos es la siguiente:

  • src
    • Expidian 
      • GlobalBundle 
        • Controller
        • DataFixtures
        • DependencyInjection
        • Entity
        • ......
        • .....
        • etc.
el problema es que para hacer esa consulta estas poniendo:

$er = $manager->getRepository("ExpidianGlobalBundle:Paises");
$pais_obj = $er->find(233);
 

tu error es que estas colocando el nombre de la "compañia" como llaman a la primara carpeta.
ahora, debe quedar así, según tu estructura de archivos:

$pais_id = $manager->getRepository('GlobalBundle:Paises')->find();

o como tu lo propones
$er =  $manager->getRepository( GlobalBundle:Paises');
$pais_id =  $er->find();

te coloco $pais_id para enfatizar que el método find no te regresa un objeto, sino el id del registro.

Danny alfonzo Viana perez

unread,
Jul 6, 2012, 11:24:49 AM7/6/12
to symfo...@googlegroups.com
disculpa, olvide el id, ahora que lo veo, si quiere que esos usuarios seas de venezuela puedes poner el id directamente en el método setPais 

$pais_id = $manager->getRepository('GlobalBundle:Paises')->find(233);


o como tu lo propones
$er =  $manager->getRepository( GlobalBundle:Paises');
$pais_id =  $er->find(233);

José Gabriel González

unread,
Jul 6, 2012, 3:34:21 PM7/6/12
to symfo...@googlegroups.com
Si le quito el ExpidianGlobalBundle y lo sustituyo por GlobalBundle me arroja otro error relacionado a que desconoce el espacio de nombre "GlobalBundle". Pero, gracias por tu respuesta.

José Gabriel González

unread,
Jul 6, 2012, 3:36:59 PM7/6/12
to symfo...@googlegroups.com
Ahora tengo este error:

[Doctrine\ORM\OptimisticLockException]
Cannot obtain optimistic lock on unversioned entity


Alguien sabe por qué sucede?

helysm

unread,
Jul 8, 2012, 4:10:23 PM7/8/12
to symfo...@googlegroups.com

Hay algo que no entiendo si estas creando las fixtures por que haces consultas de un pais que no haz creado por que no lo veo en las fixtures que lo crees, ademas cuando relacionas una entidad con otra a traves del set debes saber que el set no recibe la id de la entidad a relacionar sino la entidad misma ya que si observas en el seter hay una restriccion de que el valor a recibir debe ser una entity pais y no un valor entero.

El jul 6, 2012 2:37 p.m., "José Gabriel González" <jgabriel...@gmail.com> escribió:

Ahora tengo este error:

[Doctrine\ORM\OptimisticLockException]
Cannot obtain optimistic lock on unversioned entity


Alguien sabe por qué sucede?



El viernes, 6 de julio de 2012 15:04:21 UTC-4:30, José Gabriel González escribió:


>
> Si le quito el ExpidianGlobalBundle y lo sustituyo por GlobalBundle me arroja otro error relaci...

José Gabriel González

unread,
Jul 8, 2012, 6:07:30 PM7/8/12
to symfo...@googlegroups.com
Gracias, tienes toda la razón Helinux y si vez detenidamente el código no lo estoy haciendo de otra manera. Yo estoy pasando una entidad País a la entity Persona. Por otra parte este país sí existe y estoy tratando de buscarlo por su Id (233). Ya logré resolver el problema gracias a la ayuda de Javier Eguiluz:

Tenía que utilizar la función findOneBy del repositorio en vez de find. Les invito a ver cómo quedó el código de los datafixtures puede que lo lleguen a necesitar en algún momento:

https://github.com/jgabrielsinner10/expidian/tree/master/src/Expidian/GlobalBundle/DataFixtures/ORM

Ah! Recuerden usar el comando

php app/console doctrine:fixtures:load --append                             
                                             
Me lleve una gran "desilusión" para no decir una grosería al no utilizar el --append ya que borra todos los datos previamente cargados si no usamos esta opción.

helysm

unread,
Jul 13, 2012, 5:32:02 PM7/13/12
to symfo...@googlegroups.com
Men gracias por informar como lo solucionaste, hoy se me presento un caso de querer hacer una busqueda en fixtures y me acorde inmediatamente de su solucion.

Gracias.

Si encuentras la solución a tu problema no olvides postearla, es por el beneficio de todos en la lista.

Atentamente,

Hely Suarez Marin
Desarrollador PHP Symfony
Miembro del Semillero de Investigación y Desarrollo de Software Libre UFPS
No a la Piratería de Software !Sea Legal con Colombia! Usa Software Libre...
Cúcuta


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

Reply all
Reply to author
Forward
0 new messages