Base de datos Nette

Nette Database es una potente y elegante capa de base de datos para PHP, conocida por su simplicidad y sus funciones inteligentes. No requiere ninguna configuración compleja ni generación de entidades, lo que le permite empezar a trabajar con ella inmediatamente.

Con Nette Database, puede trabajar de dos maneras:

SQL directo

  • 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

Explorador

  • 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

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(
		private Nette\Database\Connection $database,
	) {
	}
}

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

Dos enfoques del trabajo con bases de datos

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

Enfoquedirecto – 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";
	}
}

EnfoqueExplorador – 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 enfoque Directo genera N+1 consultas (una para los autores y otra para los libros de cada autor), mientras que el Explorador realiza sólo 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.

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.

Bases de datos compatibles

Nette Database soporta las siguientes bases de datos:

Servidor de Base de Datos Nombre DSN Soporte Explorador
MySQL (>= 5.1) mysql SI    
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    
versión: 4.0