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 unNette\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 unNette\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 |