ccc

Mostrando entradas con la etiqueta Symfony BD. Mostrar todas las entradas
Mostrando entradas con la etiqueta Symfony BD. Mostrar todas las entradas

Symfony BD: Ejecución de consultas complejas con DQL

// *********************************
   public function listadoActoresAction()
    {
        $em = $this->getDoctrine()->getManager();
        $parametros = array(
            'annoOscar' => '1941',
            'tituloPelicula1' => '%sargento%',
            'tituloPelicula2' => '%camino%'
        );

        $dql = 'SELECT a
            FROM cineactoresBundle:Actores a
            WHERE a.annoOscar >= :annoOscar
            AND a.tituloPelicula LIKE :tituloPelicula1
            OR a.tituloPelicula LIKE :tituloPelicula2
            ORDER BY a.annoOscar';

        $query = $em->createQuery($dql)->setParameters($parametros);
        $arrActores = $query->getResult();
        return $this->render('cineactoresBundle:Default:listadoActores.html.twig', array('actores' => $arrActores));
     }

Symfony BD: Ejemplo métodos básicos

<?php
namespace cine\actoresBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use cine\actoresBundle\Entity\Actores; // para trabajar con esa tabla de la BD

use Symfony\Component\HttpFoundation\Response;

class DefaultController extends Controller
{
    // *********************************
    public function indexAction($name)
    {
        return $this->render('cineactoresBundle:Default:index.html.twig', array('name' => $name));
    }
   
    // *********************************
    public function borrarActorAction($id)
    {
        $em = $this->getDoctrine()->getManager();
        $repositorio = $em->getRepository('cineactoresBundle:Actores');
        $actor = $repositorio->findOneById($id); // solo devolverá uno
       
        if (!$actor)
            throw $this->createNotFoundException('No se puede borrar porque no existe el id:'.$id);
       
        $em->remove($actor);
        $em->flush(); // lo borra de la BD
        return New Response('Se ha eliminado correctamente el actor con el id:'.$id);
    }
   
    // *********************************
    public function insertarActorAction($nombre, $anno, $tituloPelicula)
    {
        // Insertar en BD
        $actor = new Actores();
        $actor->setNombre($nombre);
        $actor->setAnnoOscar($anno);
        $actor->setTituloPelicula($tituloPelicula);
   
        $em = $this->getDoctrine()->getManager();
        $em->persist($actor);
        $em->flush();
       
        return new Response("El actor ".$nombre." se ha metido correctamente con el id:".$actor->getId());
   }
   
   // *********************************
   public function listadoActoresAction()
    {
        $em = $this->getDoctrine()->getManager();
        $repositorio = $em->getRepository('cineactoresBundle:Actores');
 
        $arrActores = $repositorio->findAll();
        return $this->render('cineactoresBundle:Default:listadoActores.html.twig', array('actores' => $arrActores));
    }
   
    // *********************************
    public function modificarActorAction($id, $nombre, $anno, $tituloPelicula)
    {
        $em = $this->getDoctrine()->getManager();
        $repositorio = $em->getRepository('cineactoresBundle:Actores');
        $actor = $repositorio->findOneById($id); // solo devolverá uno
       
        if (!$actor)
            throw $this->createNotFoundException('No se ha encontrado el actor con id:'.$id);
                  
        $actor->setNombre($nombre);
        $actor->setAnnoOscar($anno);
        $actor->setTituloPelicula($tituloPelicula);
       
        $em->persist($actor);
        $em->flush(); // lo guarda en la BD
       
        return new Response("Se ha modificado correctamente el actor con id: ".$id);
    }
   
    // *********************************
    public function showActorPorIdAction($id)
    {   
        $em = $this->getDoctrine()->getManager();
        $repositorio = $em->getRepository('cineactoresBundle:Actores');
        $arrActores = $repositorio->findOneById($id); // solo devolverá uno
        return $this->render('cineactoresBundle:Default:showActor.html.twig', array('actores' => $arrActores));
    }
   
    // *********************************
    public function showActorPorNombreAction($nombre)
    {
        $em = $this->getDoctrine()->getManager();
        $repositorio = $em->getRepository('cineactoresBundle:Actores');
         $arrActores = $repositorio->findBy(array("nombre"=>$nombre));
        return $this->render('cineactoresBundle:Default:showActor.html.twig', array('actores' => $arrActores));
       
    }
   
    // *********************************
    public function showActorPorCampoAction($nombre_campo, $valor)
    {
        $em = $this->getDoctrine()->getManager();
        $repositorio = $em->getRepository('cineactoresBundle:Actores');
        $arrActores = $repositorio->findBy(array($nombre_campo=>$valor));
        return $this->render('cineactoresBundle:Default:showActor.html.twig', array('actores' => $arrActores));
    }

}

Symfony: Controller: Filtrando datos de la BD

Mostrar todos los registros:
public function listadoActoresAction()
    {
        $repository = $this->getDoctrine()->getRepository('cineactoresBundle:Actores');
        $arrActores = $repository->findAll();
        return $this->render('cineactoresBundle:Default:listadoActores.html.twig', array('actores' => $arrActores));
    }

http://symfonylsg.dev/app_dev.php/listadoActores

Mostrar los resultados de un registro por su Id:
public function showActorPorIdAction($id)
    {  
        $repository = $this->getDoctrine()->getRepository('cineactoresBundle:Actores');
        $arrActores = $repository->findOneById($id); // solo devolverá uno
        return $this->render('cineactoresBundle:Default:showActor.html.twig', array('actores' => $arrActores));
    }

http://symfonylsg.dev/app_dev.php/showActorPorId/3

Mostrar los resultados de un registro filtrando por un campo concreto:
En el routing:
cineactores_showActorPorCampo:
    pattern:  /showActorPorCampo/{nombre_campo}/{valor}
    defaults: { _controller: cineactoresBundle:Default:showActorPorCampo }

En el controller:
public function showActorPorCampoAction($nombre_campo, $valor)
    {
        $repository = $this->getDoctrine()->getRepository('cineactoresBundle:Actores');
        $arrActores = $repository->findBy(array($nombre_campo=>$valor));
        return $this->render('cineactoresBundle:Default:showActor.html.twig', array('actores' => $arrActores));
    }

Ejemplos:
symfonylsg.dev/app_dev.php/showActorPorCampo/tituloPelicula/El sargento York
http://symfonylsg.dev/app_dev.php/showActorPorCampo/nombre/James%20Cagney

Las vista de showActor.html.twig sería: 
{% extends 'cineactoresBundle::main.html.twig' %}

{% block title %} Mostrando detalles  {%endblock%}

{% block contenido %}
    {# comentario: {{ dump(actores) }} #}
    <h1>Detalles del actor </h1>
    {% if actores.id is defined %} {#Ha filtrado por id y solo hay un registro #}
            <div><h2>{{actores.id}} - {{actores.nombre}} - {{ actores.tituloPelicula }} - {{ actores.annoOscar }}</h2> </div>
    {% else %} {#Ha filtrado por un campo y devuelve varios registros #}
            {% for actor in actores %}
                <div><h2>{{actor.id}} - {{actor.nombre}} - {{ actor.tituloPelicula }} - {{ actor.annoOscar }}</h2> </div>
            {%  endfor %}
    {% endif %}
{% endblock %}

{% block lateralDer %}
<a href="../listadoActores">Volver al listado</a>
{% endblock %}

Symfony: Crear BD y tablas

Creamos en phpmyadmin una base de datos: cine_symfony

Nos vamos a:
\app\config\parameters.yml y especificamos el nombre de nuestra BD y demás datos (el puerto no es necesario)

Entramos en la consola (Windows+R) y CMD.

Nos vamos a  Symfony: D:\wamp\www\pruebasymfony y escribimos:

php app/console doctrine:generate:entity
Especificamos el nombre del Bundle al que pertenece y el nombre de la tabla que queremos crear (en este caso Actores), sería:

cineactoresBundle:Actores
El formato será Annotation
Vamos indicando el nombre de los campos (excepto el Id que se mete solo por defecto) de esa nueva tabla así como el tipo (el listado de tipos lo tienes en: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/basic-mapping.html#property-mapping)

Una vez terminado se habrá creado en \src\cine\actoresBundle una nueva carpeta llamada entity que contiene  el fichero Actores.php donde está toda la estructura de la tabla (aunque todavía no está creada en el PHPmyAdmin).

Para crearla volvemos a la consola:
php app/console doctrine:schema:create

Una vez creada si quisieramos modificar el fichero Actores.php (por ejemplo eliminando campos o añadiendo campos nuevos con sus correspondientes métodos de get y set) lo haremos a pelo directamente en el fichero y para que esos cambios se reflejen en la BD ejecutamos desde consola:

IMPORTANTE: Cuando editemos el fichero entity (por ejemplo Actores.php) y añadamos un nuevo campo hay que añadir también sus características:
/**
     * @var string
     *
     * @ORM\Column(name="email", type="string", length=40)
     */
     private $email;

Para modificarlo desde la consola:
php app/console doctrine:schema:update --force

Si deseamos borrar una tabla de la BD será con drop:
php app/console doctrine:schema:drop --force

----------------------------------------------------------------------------

INSERTAR EN LA TABLA DE LA BD

a) Crearlo en el routing de nuestro Budble
cineactores_insertarActor:
    pattern:  /insertarActor
    defaults: { _controller: cineactoresBundle:Default:insertarActor }
b) En el controller de nuestro Buddle añadir:
use cine\actoresBundle\Entity\Actores; // para trabajar con esa tabla de la BD
Y añadir el correspondiente método:
public function insertarActorAction()  {
        // Insertar en BD (lo correcto sería desde un formulario no así escrito a pelo)
        $actor = new Actores();
        $actor->setNombre("James Stewart");
        $actor->setAnnoOscar("1940");
        $actor->setTituloPelicula("Historias de philadelphia");
       
        $em = $this->getDoctrine()->getManager();
        $em->persist($actor);
        $em->flush();
        return $this->redirect($this->generateUrl('cineactores_listadoActores'));// lo sacamos del routing
    }

Para ejecutarlo:
http://localhost/pruebasymfony/web/app_dev.php/insertarActor

MOSTRAR EL LISTADO DE ESA TABLA DE LA BD
a) Si no existe en el routing de ese Bundle crearlo.
b) En el controller de ese Buddle añadir:
public function listadoActoresAction()  {
        $repository = $this->getDoctrine()->getRepository('cineactoresBundle:Actores');
        $actores = $repository->findAll();
        return $this->render('cineactoresBundle:Default:listadoActores.html.twig', array('actores' => $actores)); // que se vaya a esa vista
    }

// Para mostrar el de un registro en concreto por su id:
public function showActorAction($id)  {   
        $repository = $this->getDoctrine()->getRepository('cineactoresBundle:Actores');
        $actor = $repository->find($id);
        return $this->render('cineactoresBundle:Default:showActor.html.twig', array('actor' => $actor));
    }