Nette Database

Nette Database es una capa de base de datos potente y elegante para PHP con énfasis en la simplicidad y funciones inteligentes. Ofrece dos formas de trabajar con la base de datos: Explorer para el desarrollo rápido de aplicaciones, o acceso SQL para el trabajo directo con consultas.

Acceso SQL

  • Consultas parametrizadas seguras
  • Control preciso sobre la forma de las consultas SQL
  • Cuando escribe consultas complejas con funciones avanzadas
  • Optimiza el rendimiento utilizando funciones SQL específicas

Explorer

  • Desarrolla rápidamente sin escribir SQL
  • Trabajo intuitivo con relaciones entre tablas
  • Apreciará la optimización automática de consultas
  • Adecuado para un trabajo rápido y cómodo con la base de datos

Instalación

Descarga e instala la librería usando la herramienta Composer:

composer require nette/database

Bases de datos soportadas

Nette Database soporta las siguientes bases de datos:

Servidor de base de datos Nombre DSN Soporte en Explorer
MySQL (>= 5.1) mysql
PostgreSQL (>= 9.0) pgsql
Sqlite 3 (>= 3.8) sqlite
Oracle oci
MS SQL (PDO_SQLSRV) sqlsrv
MS SQL (PDO_DBLIB) mssql
ODBC odbc

Dos enfoques para la base de datos

Nette Database te da una opción: puedes escribir consultas SQL directamente (acceso SQL), o dejar que se generen automáticamente (Explorer). Veamos cómo ambos enfoques resuelven las mismas tareas:

Acceso SQL – Consultas SQL

// insertar registro
$database->query('INSERT INTO books', [
	'author_id' => $authorId,
	'title' => $bookData->title,
	'published_at' => new DateTime,
]);

// obtener registros: autores de libros
$result = $database->query('
	SELECT authors.*, COUNT(books.id) AS books_count
	FROM authors
	LEFT JOIN books ON authors.id = books.author_id
	WHERE authors.active = 1
	GROUP BY authors.id
');

// listado (no óptimo, genera N consultas adicionales)
foreach ($result as $author) {
	$books = $database->query('
		SELECT * FROM books
		WHERE author_id = ?
		ORDER BY published_at DESC
	', $author->id);

	echo "Autor $author->name escribió $author->books_count libros:\n";

	foreach ($books as $book) {
		echo "- $book->title\n";
	}
}

Enfoque Explorer – generación automática de SQL

// insertar registro
$database->table('books')->insert([
	'author_id' => $authorId,
	'title' => $bookData->title,
	'published_at' => new DateTime,
]);

// obtener registros: autores de libros
$authors = $database->table('authors')
	->where('active', 1);

// listado (genera automáticamente solo 2 consultas optimizadas)
foreach ($authors as $author) {
	$books = $author->related('books')
		->order('published_at DESC');

	echo "Autor $author->name escribió {$books->count()} libros:\n";

	foreach ($books as $book) {
		echo "- $book->title\n";
	}
}

El enfoque Explorer genera y optimiza las consultas SQL automáticamente. En el ejemplo dado, el acceso SQL generará N+1 consultas (una para los autores y luego una para los libros de cada autor), mientras que Explorer optimiza automáticamente las consultas y realiza solo dos: una para los autores y otra para todos sus libros.

Ambos enfoques se pueden combinar libremente en la aplicación según sea necesario.

Conexión y configuración

Para conectarse a la base de datos, simplemente crea una instancia de la clase Nette\Database\Connection:

$database = new Nette\Database\Connection($dsn, $user, $password);

El parámetro $dsn (data source name) es el mismo que utiliza PDO, por ejemplo, mysql:host=127.0.0.1;dbname=test. En caso de fallo, lanza una excepción Nette\Database\ConnectionException.

Sin embargo, una forma más conveniente es ofrecida por la configuración de la aplicación, donde simplemente necesitas agregar la sección database y se crearán los objetos necesarios, así como el panel de base de datos en la barra Tracy.

database:
	dsn: 'mysql:host=127.0.0.1;dbname=test'
	user: root
	password: password

Luego, obtenemos el objeto de conexión como servicio del contenedor DI, por ejemplo:

class Model
{
	public function __construct(
		// o Nette\Database\Explorer
		private Nette\Database\Connection $database,
	) {
	}
}

Más información sobre la configuración de la base de datos.

Creación manual de Explorer

Si no utilizas el contenedor Nette DI, puedes crear manualmente una instancia de Nette\Database\Explorer:

// conexión a la base de datos
$connection = new Nette\Database\Connection('mysql:host=127.0.0.1;dbname=mydatabase', 'user', 'password');
// almacenamiento para caché, implementa Nette\Caching\Storage, por ejemplo:
$storage = new Nette\Caching\Storages\FileStorage('/ruta/a/directorio/temp');
// se encarga de la reflexión de la estructura de la base de datos
$structure = new Nette\Database\Structure($connection, $storage);
// define reglas para mapear nombres de tablas, columnas y claves foráneas
$conventions = new Nette\Database\Conventions\DiscoveredConventions($structure);
$explorer = new Nette\Database\Explorer($connection, $structure, $conventions, $storage);

Gestión de la conexión

Al crear un objeto Connection, la conexión se establece automáticamente. Si deseas posponer la conexión, utiliza el modo lazy; puedes activarlo en la configuración estableciendo lazy: true, o de esta manera:

$database = new Nette\Database\Connection($dsn, $user, $password, ['lazy' => true]);

Para gestionar la conexión, utiliza los métodos connect(), disconnect() y reconnect().

  • connect() crea una conexión si aún no existe, y puede lanzar una excepción Nette\Database\ConnectionException.
  • disconnect() desconecta la conexión actual a la base de datos.
  • reconnect() realiza una desconexión y luego una reconexión a la base de datos. Este método también puede lanzar una excepción Nette\Database\ConnectionException.

Además, puedes monitorear los eventos relacionados con la conexión utilizando el evento onConnect, que es un array de callbacks que se llaman después de establecer una conexión con la base de datos.

// se ejecuta después de conectarse a la base de datos
$database->onConnect[] = function($database) {
	echo "Conectado a la base de datos";
};

Tracy Debug Bar

Si utilizas Tracy, el panel Database se activa automáticamente en la barra de depuración, mostrando todas las consultas ejecutadas, sus parámetros, el tiempo de ejecución y la ubicación en el código donde fueron llamadas.

versión: 4.0