Tutorial Jobeet con Symfony2 Día 6: Más trabajo con el modelo

De WikiSalud
(Diferencias entre revisiones)
Saltar a: navegación, buscar
(Depurando el SQL generado por Doctrine)
 
(Depurando el SQL generado por Doctrine y otra secciones)

Revisión de 09:36 23 mayo 2014

Contenido

El objeto de consulta Doctrine

De los requerimientos del segundo día: "En la página principal, los usuarios ven las últimas ofertas de trabajo activas." Pero hasta ahora, todos las ofertas son mostradas, si están activas o no.

src/Ens/JobeetBundle/Controller/JobController.php
// src/Ens/JobeetBundle/Controller/JobController.php
// ...
 
class JobController extends Controller
{
  public function indexAction()
  {
    $em = $this->getDoctrine()->getEntityManager();
 
    $entities = $em->getRepository('EnsJobeetBundle:Job')->findAll();
 
    return $this->render('EnsJobeetBundle:Job:index.html.twig', array(
      'entities' => $entities
    ));
 
  // ...
}

Una oferta de trabajo activa es aquella que fue publicada hace menos de 30 días. El método $entities = $em->getRepository('EnsJobeetBundle:Job')->findAll() obtendrá todos los trabajos. No estamos especificando ninguna condición, lo cual significa que todos los registros son recuperados de la base de datos Cambiemoslo para seleccionar solo ofertas de trabajo activas


src/Ens/JobeetBundle/Controller/JobController.php
public function indexAction()
{
  $em = $this->getDoctrine()->getEntityManager();
 
  $query = $em->createQuery(
    'SELECT j FROM EnsJobeetBundle:Job j WHERE j.created_at > :date'
  )->setParameter('date', date('Y-m-d H:i:s', time() - 86400 * 30));
  $entities = $query->getResult();
 
  return $this->render('EnsJobeetBundle:Job:index.html.twig', array(
    'entities' => $entities
  ));
}

Depurando el SQL generado por Doctrine

Algunas veces, es bastante útil ver el SQL generado por Doctrine, por ejemplo, para depurar a consulta que no trabaja como se espera. En el ambiente de desarrollo, gracias a la barra de herramientas web para depuración, toda la información que necesitas esta disponible desde la comodidad de tu navegador (http://jobeet.local/app_dev.php): Acá va una imagen sobre esa puta barra Acá va otra imagen sobre el sql generado

Serialización de objetos

Incluso si el codigo arriba trabaja, esta lejos de ser perfecto y no toma en cuenta algunos requerimientos del día 2: "Un usuario puede regresar y reactiva o extender la validez de una oferta de trabajo por un extra de 30 días..." But as the above code only relies on the created_at value, and because this column stores the creation date, we cannot satisfy the above requirement.

Si recuerdas el esquema de la base de datos descrita durante el día 3, también tenemos definida una columna expires_at. Actualmente, si este valor no esta configurado en el archivo de fixture, permanece siemper vacío. <revisar la realidad de esto. En realidad debe llenarse por el esquema>, puede cuando una oferta de trabajo es creada, puede ser automaticamente configurada a 30 días después de la actual fecha. Cuando necesitas hacer algo automicamente antes de que un objeto Doctrine sea serializado a la base de datos, puedes añadir estas acciones a las callback del ciclo de vida en el archivo que mapea objetos a la base de datos, como hicimos antes con la columna created_at column.

src/Ens/JobeetBundle/Resources/config/doctrine/Job.orm.yml
# src/Ens/JobeetBundle/Resources/config/doctrine/Job.orm.yml
# ...
 
  lifecycleCallbacks:
    prePersist: [ setCreatedAtValue, setExpiresAtValue ]
    preUpdate: [ setUpdatedAtValue ]

Ahora tenemos que reconstruir las clases de las entidades, así Doctrine añadirá la nueva función:

php app/console doctrine:generate:entities EnsJobeetBundle

Abre el archivo src/Ens/JobeetBundle/Entity/Job.php y edita la nueva función añadida:

src/Ens/JobeetBundle/Entity/Job.php
# src/Ens/JobeetBundle/Entity/Job.php
# ...
 
public function setExpiresAtValue()
{
  if(!$this->getExpiresAt())
  {
    $now = $this->getCreatedAt() ? $this->getCreatedAt()->format('U') : time();
    $this->expires_at = new \DateTime(date('Y-m-d H:i:s', $now + 86400 * 30));
  }
}

Ahora, cambiemos la acción para usar la columna expires_at en lugar de created_at para seleccionar las ofertas de trabajo activas:

src/Ens/JobeetBundle/Controller/JobController.php
// src/Ens/JobeetBundle/Controller/JobController.php
// ...
 
public function indexAction()
{
  $em = $this->getDoctrine()->getEntityManager();
 
  $query = $em->createQuery(
    'SELECT j FROM EnsJobeetBundle:Job j WHERE j.expires_at > :date'
  )->setParameter('date', date('Y-m-d H:i:s', time()));
  $entities = $query->getResult();
 
  return $this->render('EnsJobeetBundle:Job:index.html.twig', array(
    'entities' => $entities
  ));
}

Trabajando sobre Fixtures

Herramientas personales
Espacios de nombres

Variantes
Acciones
Navegación
Herramientas