CakePHP: Ejecutando un query a la antigua - Userlinux.net

Hay veces que la versatilidad del framework no es suficiente según el tipo de operaciones que se quieran realizar -o el límite del desarrollador, que también influye-. Imaginemos un objeto Post del que queremos actualizar el número de veces que se ha visitado -los típicos hits-. En CakePHP y siguiendo…

CakePHP: Ejecutando un query a la antigua

21.Feb.2008 ~ 3 Comentarios ~ 5253 Lecturas
Hay veces que la versatilidad del framework no es suficiente según el tipo de operaciones que se quieran realizar -o el límite del desarrollador, que también influye-.

Imaginemos un objeto Post del que queremos actualizar el número de veces que se ha visitado -los típicos hits-. En CakePHP y siguiendo sus convenciones sería algo similar a lo siguiente:

$post['Post']['hits']++;
$this->Post->save($post)
Lo cual genera un SQL digno de mención por otra parte:
UPDATE `posts` AS `Post` LEFT JOIN `users` AS `User` ON (`Post`.`user_id` = `User`.`id`) SET `Post`.`id` = 1128, `Post`.`user_id` = 1, `Post`.`keywords` = '', `Post`.`status` = 1, `Post`.`status_comments` = 1, `Post`.`hits` = 413, `Post`.`slug` = 'el_titulo_de_prueba', `Post`.`rating` = '0', `Post`.`created` = '2008-02-20 13:56:05', `Post`.`modified` = '2008-02-21 10:43:50' WHERE `Post`.`id` IN (1128)
Vemos que, además de actualizar el valor de los hits, actualiza los campos de fechas, el slug, el estado del Post... y no siempre es lo conveniente.

En este caso concreto la complicación venía por el slug, puesto que si cambiaba de idioma a inglés (por ejemplo), al actualizar los hits este campo se convertía en un "probing_title" con lo que el comportamiento del UPDATE rompía los esquemas del blog, los enlaces, los rss...

A falta de más conocimiento se me ocurrió ejecutar la sentencia SQL a la vieja usanza, así que creé la siguiente función dentro del modelo post.php:
function update_hits($slug, $hits)
{
	$this->query("UPDATE posts SET hits=$hits WHERE slug='$slug'");
}
La llamaremos desde la función view($slug) del controlador:
$hits = $post['Post']['hits']+1;
$this->Post->update_hits($slug, $hits);
El SQL resultante se ajusta un poco más a la realidad:
UPDATE posts SET hits=414 WHERE slug='el_titulo_de_prueba'
Lo dicho al principio, hay veces que es muy cómodo trabajar con las convenciones del framework, pero lo mejor es saber combinarlas con la vieja usanza, según necesidades.
Categorías: programación

Comentarios


gravatar
22.Feb.2008
Amos a ahorrar una linea y aligerar un casi nada el código... por aquello del qué dirán :D

$this->Post->update_hits($slug);

function update_hits($slug, $hits)
{
$this->query("UPDATE posts SET hits=hits+1 WHERE slug='$slug'");
}

gravatar
22.Feb.2008
Erm.. en la declaración de la función sobra el $hits, obviamente, bastaría con el $slug... las prisas xE

function update_hits($slug)

gravatar
22.Feb.2008
Estos son los pequeños detalles que diferencian a las personas que se preocupan por su código y las que no nos preocupamos tanto ;).

Comentarios


Los comentarios están cerrados: los comentarios se cierran automáticamente una vez pasados 15 días. Si quieres comentar algo acerca de la anotación, puedes hacerlo por e-mail.

Buscar

Cargando...

Últimos comentarios

  • Juan
  • Marina
  • Francisco
  • fon
  • minWi
  • isra
  • reidrac
  • r0sk
  • Rodrigo Rega
  • minWi
  • r0sk
  • reidrac
  • r0sk
  • deady
  • errece

Moneting

Valor de mi cuenta de Facebook según Moneting
Valor de mi cuenta de Twitter según Moneting

Tagcloud

ssh frases champions userlinux iphone lugo rsidenotes felicidades films nintendo opinion sysadmin 2008 blogsfera vacaciones juegos cake ds debian sidenotes apple web blogs mac mysql cakephp deportes 2007 mundial openbsd barça ubuntu twitter blog humor meme canción alemania_2006 games bsd lucux linux twitt programación cumpleaños software django league bash macosx ps3 rfilms conciertos freebsd seguridad personal hack php bake futbol

Archivo

Social

Enlaces de interés