Base de datos Nette

Nette Database es una potente y elegante capa de base de datos para PHP con un enfoque en la simplicidad y características inteligentes. Ofrece dos formas complementarias de trabajar con sus datos – utilizando el Explorador para un desarrollo rápido, o la forma SQL para un control total sobre las consultas.

Vía SQL

  • Consultas seguras y parametrizadas
  • Control preciso de la estructura de las consultas SQL
  • Ideal para escribir consultas complejas con funciones avanzadas
  • Optimización del rendimiento mediante funciones SQL específicas

Vía Explorer

  • Desarrollo rápido sin escribir SQL
  • Manejo intuitivo de las relaciones entre tablas
  • Optimización automática de consultas
  • Ideal para interactuar rápida y cómodamente con la base de datos

Instalación

Puede descargar e instalar la biblioteca utilizando Composer:

composer require nette/database

Bases de datos compatibles

Nette Database es compatible con las siguientes bases de datos:

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

Dos enfoques del trabajo con bases de datos

Con Nette Database, puede escribir consultas SQL directamente (modo SQL) o dejar que SQL se genere automáticamente (modo Explorer). Veamos cómo ambos enfoques resuelven las mismas tareas:

Método SQL – Escribir consultas SQL

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

// Recuperar 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
');

// Visualizar (no es ó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 "Author $author->name has written $author->books_count books:\n";

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

Explorer way – Generación automática de SQL

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

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

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

	echo "Author $author->name has written {$books->count()} books:\n";

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

El método Explorer genera y optimiza automáticamente las consultas SQL. En el ejemplo anterior, el ejemplo SQL way genera N+1 consultas (una para los autores y otra para los libros de cada autor), mientras que el Explorer realiza solo dos consultas optimizadas: una para los autores y otra para todos sus libros.

Puede combinar libremente ambos enfoques en su aplicación según sus necesidades.

Conexión y configuración

Para conectarse a la base de datos, basta con crear una instancia de la clase Nette\Database\Connection:

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

El parámetro $dsn (Data Source Name) sigue el mismo formato que utiliza PDO, por ejemplo, host=127.0.0.1;dbname=test. Si la conexión falla, lanza el mensaje Nette\Database\ConnectionException.

Sin embargo, un método más conveniente es utilizar la configuración de la aplicación. Añade una sección database, y se crearán los objetos necesarios, incluyendo un panel de base de datos en la barra de depuración de Tracy.

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

Después de esto, el objeto de conexión puede ser recuperado como un servicio desde el contenedor DI, por ejemplo:

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

Para más información, véase configuración de la base de datos.

Creación manual del explorador

Si no está utilizando el contenedor Nette DI, puede crear manualmente una instancia de Nette\Database\Explorer:

// database connection
$connection = new Nette\Database\Connection('mysql:host=127.0.0.1;dbname=mydatabase', 'user', 'password');
// cache storage, implements Nette\Caching\Storage, e.g.:
$storage = new Nette\Caching\Storages\FileStorage('/path/to/temp/dir');
// handles database structure reflection
$structure = new Nette\Database\Structure($connection, $storage);
// defines rules for mapping table names, columns, and foreign keys
$conventions = new Nette\Database\Conventions\DiscoveredConventions($structure);
$explorer = new Nette\Database\Explorer($connection, $structure, $conventions, $storage);

Gestión de conexiones

Cuando se crea un objeto Connection, éste se conecta automáticamente a la base de datos. Si desea retrasar la conexión, active el modo perezoso en la configuración configurando lazy, o hágalo así:

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

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

  • connect() establece una conexión si aún no se ha establecido y puede lanzar un Nette\Database\ConnectionException.
  • disconnect() se desconecta de la base de datos.
  • reconnect() se desconecta y luego se vuelve a conectar a la base de datos, y también puede lanzar un Nette\Database\ConnectionException.

Además, puedes monitorizar los eventos de conexión usando el evento onConnect, que es un array de callbacks ejecutados después de conectarse a la base de datos.

// Llamada después de conectarse a la base de datos
$database->onConnect[] = function($database) {
	echo "Connected to the database";
};

Barra de depuración de Tracy

Si utiliza Tracy, el panel Base de Datos de la Barra de Depuración se activa automáticamente. Muestra 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