Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Generar código a partir de id en Symfony

16 de diciembre de 2014

Hola, yo de nuevo :D

Estaba leyendo el ejemplo de Cupón, la aplicación en Symony, para aprender más. He visto que hay una parte donde se genera el slug a partir del nombre, llamando a la función estática $this->slug = Util::getSlug($nombre); dentro del setNombre() en la entidad.

Ahora, si yo quiero generar un código a partir del id de la entidad, ¿cómo podría hacerlo? Cuando genero la entidad desde la consola con el comando doctrine:generate:entity, el id tiene una estrategia autoincremental, así que no se genera un setId() para éste. He intentado:

/**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
        $this->code = Util::makeMeCode($this->id);
    }

Pero me salta un error, diciéndome que la columna code no puede ser nula (esto es, entonces, no me ha generado el código a partir del id).

¿Cómo podría hacerlo? Intenté también desde el controlador, pero tiene el mismo problema, pues no podría hacer algo como un $entity->getId()

Gracias por sus respuestas

EDITO: Lo he solucionado parcialmente haciendo nullable la columna code y generando ese valor inmediatamente despues de la inserción:

if ($form->isValid()) {
    $em = $this->getDoctrine()->getManager();
    $em->persist($entity);
    $em->flush();
 
    //Regenerate the code
    $myID = $entity->getId();
    $entity->setCode(Util::makeMeCode($myID));
    $em->persist($entity);
    $em->flush();
 
    return $this->redirect($this->generateUrl('template_show', array('id' => $entity->getId())));
}

Aún así, creo que no debería hacerse de la misma manera, pues genera dos consultas para guardar un solo registro en la base de datos. Quizás alguien tiene una solución más óptima


Respuestas

#1

Hola @SakyaStelios,

para asignar o crear un slug a partir de un dato, ese dato primero tiene que ser guardado, no puedes hacerlo cuando obtienes el id sin haberlo guardado previamente, ademas que en el ejemplo que muestra esta retornando el id, así que la función de generar el slug no lo utiliza.

Hay muchas formas de hacerlas con HasLifecycleCallbacks o también cuando un dato se va a guardar seguro y que es obligatorio en tu formulario, por ejemplo yo genero el slug a partir del titulo de la siguiente forma:

/**
     * Set titulo
     *
     * @param string $titulo
     * @return Messages
     */
    public function setTitulo($titulo)
    {
        $this->titulo = $titulo;
 
        if($this->getUrl() == null)
        {
            $this->url = Util::getSlug($this->getTitulo());
        }
 
        return $this;
    }

En este ejemplo estoy haciendo que cuando guardo el titulo se guarde también la url, pero primero compruebo si no ha sido guardada anteriormente para no machacarla y si no ha sido guardada pues se lo asigno.

Espero haberme explicado bien.

Si tienes cualquier duda házmela saber.

Un saludo.

@jcarlosweb

16 diciembre 2014, 23:11
#2

Buenas,

Si no he entendido mal quieres evitar que se hagan 2 consultas, una para insertar y otra para modificar, si no que todo lo haga en una.

Para eso necesitarias usar triggers a nivel de base de datos, en el que cuando se inserte una fila lo haga con el valor generado (ejemplo)

En symfony, si usas doctrine puedes usando HasLifecycleCallbacks como ya ha dicho @jcarlosweb. No sé si con esto se hace con una consula en lugar de con 2. Pero al menos no tendrás que estar pendiente cada vez que guardes una entidad de generar a mano el campo derivado y volverlo a guardar.

@irozgar

17 diciembre 2014, 17:35
#3

Salió duplicado

@irozgar

17 diciembre 2014, 17:35
#4

Gracias a todos por sus respuestas.

Lo que ocurre es que necesito el id para convertirlo a base63 y de esta manera generar códigos únicos para cada usuario. Se que hay otras maneras , como uniqid(), pero la forma de generar el código a partir del id es un requisito. Voy a seguir buscando más maneras. Gracias a todos :D

@SakyaStelios

18 diciembre 2014, 2:40