Buenas prácticas de Clase DB Prestashop 1.4

Este artículo fue escrito por Raphaël Malié, y publicado por primera vez en el blog de PrestaShop, el 8 de agosto de 2011.

Introducción

La mayoría de los módulos y desarrollos de PrestaShop requieren que use o ingrese información en una base de datos. Cualquier desarrollador ve el núcleo de la clase DB como una parte esencial del proceso. Además de proporcionar abstracción potencial para otros tipos de bases de datos relacionales, la clase DB dispone de varias herramientas para hacer la vida más fácil.

Aprenda sobre los distintos métodos, el momento de usarlos y las mejores prácticas para la etapa de desarrollo.

Conceptos básicos de clase

La clase DB se compone de dos clases:

A pesar de que DB es seudo único, aún se puede activar manualmente si es necesario cuando el desarrollador se encuentre público. Sin embargo, en PrestaShop debe ser accedido como sigue:

$db = Db::getInstance();

En algunos casos, puede ver las peticiones según el siguiente código:

$db = Db::getInstance(_PS_USE_SQL_SLAVE_);

Cuando el anterior está conectado, podría ingresar servidores esclavos si el usuario de PrestaShop permite el uso de servidores esclavos MySQL en su arquitectura. El argumento estándar PS_USE_SQL_SLAVE sólo se debe utilizar para consultas sólo de lectura (SELECT, SHOW, etc.), y sólo si el resultado no necesita ser actualizado inmediatamente. Es necesario que utilice el servidor maestro para realizar una consulta de selección justo después de ingresar algo en la misma tabla.

Métodos Diversos

Método autoExecute()

Este método genera automáticamente la inserción o actualización de la base desde una tabla de datos. Este método debe utilizarse en lugar de hacer peticiones INSERT o UPDATE a menos que estas peticiones sean un poco más complejas (con funciones SQL, consultas intersecadas, etc.). La ventaja de utilizar un método para realizar todo es que centraliza las peticiones. Puede editar este método utilizando el sistema de reemplazo de PrestaShop cuando existe un proceso en particular para aplicar a las tablas durante la inserción.

Ejemplo ficticio:

$target = Tools::getValue('id');
$name = Tools::getValue('name');
Db::getInstance()->autoExecute('target_table', array(
	'id_target' =>    (int)$target,
	'name' =>    pSQL($name),
), 'INSERT');

Solicitar este método ofrece como resultado la siguiente consulta SQL:

INSERT INTO `target_table` (`id_target`, `name`) VALUES (10, 'myName')

Importante :

Método autoExecuteWithNullValues()

Este método realiza lo mismo que autoExecute() pero con una sutil diferencia: las cadenas vacías y los valores nulos son sustituidos por NULLs de SQL. Este método puede ser utilizado si sus campos aceptan valores nulos y resulta en que ellos sean NULL en vez de una cadena vacía.

Este método es especialmente útil al utilizar incremento automático para ingresar una entrada vacía en una tabla. La clave única en el incremento automático se ingresará como NULL evitando así una consulta de entrada sin ningún campo.

Método de eliminación ($table, $where = false, $limit = false, $use_cache = 1)

Este método es la versión DELETE de autoExecute(). Puede ser utilizado para el mismo propósito. El argumento $limit limita el número de elementos guardados que usted puede eliminar. La otra ventaja de este método es que puede ser utilizado con el sistema de caché de consulta de SQL de PrestaShop y elimina las consultas almacenadas en caché a menos que el argumento $use_cache argument sea falso.

Ejemplo :

Db::getInstance()->delete(‘target_table’, ‘myField < 15’, 3);

will generate the following query:

DELETE FROM target_table WHERE myField < 15 LIMIT 3

Método execute($sql, $use_cache = 1)

Este método ejecuta la consulta SQL ofrecida. Sólo debe ser utilizada para consultas sólo de escritura (INSERT, UPDATE, DELETE, TRUNCATE etc.), ya que también elimina la consulta caché (a menos que el argumento $use_cache sea falso).

Ejemplo:

$sql = ‘DELETE FROM ‘._DB_PREFIX_.’product WHERE date_upd < NOW()’;
if (!Db::getInstance()->Execute($sql))
	die(‘Erreur etc.)’;

Método executeS($sql, $array = true, $use_cache = 1)

Este método ejecuta la consulta SQL ofrecida y carga todos los resultados en una tabla multidimensional. No se debe usar con consultas sólo de lectura (SELECT, SHOW etc.). Los resultados de la consulta serán almacenados en caché a menos que el argumento $use_cache sea falso. El segundo argumento $array es depreciado y no debe ser utilizados, déjelo como verdadero.

Ejemplo :

$sql = ‘SELECT * FROM ‘._DB_PREFIX_.’shop’;
if ($results = Db::getInstance()->ExecuteS($sql))
	foreach ($results as $row)
		echo $row[‘id_shop’].’ :: ‘.$row[‘name’].’<br />’;

Método getRow($sql, $use_cache = 1)

Este método ejecuta la consulta SQL ofrecida y recoge la primera línea de resultados. Sólo debe ser utilizado con consultas sólo de lectura (SELECT, SHOW, etc.) Los resultados de la consulta se almacenarán en caché a menos que el argumento $use_cache sea falso.

Advertencia: este método agrega automáticamente una cláusula LIMIT a la consulta. Asegúrese de no agregar una manualmente.

Ejemplo :

$sql = ‘SELECT * FROM ‘._DB_PREFIX_.’shop
	WHERE id_shop = 42’;
if ($row = Db::getInstance()->getRow($sql))
	echo $row[‘id_shop’].’ :: ‘.$row[‘name’];

Método getValue($sql, $use_cache = 1)

Este método ejecuta la consulta SQL ofrecida y sólo recoge el primer resultado en la primera línea. Sólo debe ser utilizado con consultas de sólo lectura (SELECT, SHOW, etc.) Los resultados de la consulta se almacenan en caché a menos que el argumento $use_cache sea falso.

Advertencia: este método agrega automáticamente una cláusula LIMIT a la consulta. Asegúrese de no agregar una manualmente.

Ejemplo :

$sql = ‘SELECT COUNT(*) FROM ‘._DB_PREFIX_.’shop’;
   $totalShop = Db::getInstance()->getValue($sql);

Método NumRows()

Este método almacena en caché y muestra el número de resultados de la última consulta SQL.

Advertencia: este método no es depreciado, pero le recomendamos no utilizarlo por razones de mejor práctica. En realidad, es mejor recoger el número de resultados a través de una consulta SELECT COUNT( * ) de antemano.

Otros métodos