Que tan ineficiente puede ser incrementar un valor de un modelo

Estoy trabajando para refactorizar el codigo de meneame usando el framework cakephp.

Hoy me encontraba haciendo la logica para votar una noticia y me encontre con el problema de tener que hacer una query simple;
UPDATE `links` AS `Link` SET `Link`.`link_anonymous` = link_anonymous+1 WHERE `link_id` = 1

Esto se logra haciendo desde el modelo;
$this->updateAll(array(‘link_anonymous’=>’link_anonymous+1’),array(‘link_id’=>1));

Pero al hacer en vez de hacer el update simple que escribi mas arriba hace un update con todos los joins de los modelos;
UPDATE `links` AS `Link` LEFT JOIN `users` AS `User` ON (`Link`.`link_author` = `User`.`user_id`) LEFT JOIN `blogs` AS `Blog` ON (`Link`.`link_blog` = `Blog`.`blog_id`) LEFT JOIN `categories` AS `Category` ON (`Link`.`link_category` = `Category`.`category_id`) SET `Link`.`link_anonymous` = link_anonymous+1 WHERE `link_id` = 1 AND `limit` = ‘1’

Este update es muy costoso, intente usando las funciones del modelo saveField y save, pero no entienden el mensaje ‘link_anonymous+1’, lo transforman a 1 y yo quiero que hagan link_anonymous+1

Para solucionar este problemita agregue la funcion update, que elimina las asociaciones entre el modelo que queremos actualizar y luegos las agrega nuevamente, de esta forma el UPDATE vuelve a ser simple.

La funcion fue tomada de http://blog.pepa.info/php-html-css/cakephp/getting-rid-of-joins-in-updateall-query/

agregar a #app_model.php
/**
* A workaround for CakePHP lack of support for recursive
*/
function updateAll($fields, $conditions = true, $recursive = null) {
if (!isset($recursive)) {
$recursive = $this->recursive;
}

if ($recursive == -1) {
$this->unbindModel(array(
‘belongsTo’ => array_keys($this->belongsTo),
‘hasOne’ => array_keys($this->hasOne)
), true);
}

return parent::updateAll($fields, $conditions);
}

Luego hago;
$this->updateAll(array(‘link_anonymous’=>’link_anonymous+1’),array(‘link_id’=>1),-1);

y… voila!
UPDATE `links` AS `Link` SET `Link`.`link_anonymous` = link_anonymous+1 WHERE `link_id` = 1

EDITO: hoy agregue un ticket al equipo de desarrollo de cakephp… a ver que contestan

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s