Etiquetas
Voy a comentar un truco muy sencillo, pero que no recuerdo haberlo visto implementado (si no lo provee ya el framework que se use), a pesar de lo que simplifica la programación a la hora de almacenar en base de datos relacionales propiedades arbitrarias de un objeto. El siguiente es parte del código de profile.php de Menéame que almacena la «bio» de un usuario.
if(!empty($_POST['bio']) || $user->bio) { ... if ($bio != $user->bio) $user->bio = $bio; }
Este otro de libs/user.php, y almacena en la base de datos las actualizaciones del karma de un usuario (y su hora de modificación).
if (! empty($log) && mb_strlen($log) > 5) { $this->karma_log .= "$log: $inc, " . _('nuevo karma') . ": $this->karma\n"; $this->karma_calculated = time(); }
Nota: «.=» es una concatenación, implica dos operaciones, «get» y luego «set».
Las propiedades bio, karma_log y karma_calculated se almacenan en la base de datos, pero no están en la base de datos de usuarios como las demás. Como no son parte del fastpath (no se consultan ni visualizan en las páginas más vistas) estos datos se almacenan por separado, en la tabla genérica annotations.
Sin embargo, a la hora de acceder o almacenar esos datos, no tenemos que preocuparnos de leer e insertar en la base de datos, se hace de forma «automática». Explico cómo hacerlo, es un buen patrón cuando se requieran almacenar y acceder a propiedades arbitrarias de un objeto. Además sirve para cualquier lenguaje orientado a objetos.