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 | SÍ |
PostgreSQL (>= 9.0) | pgsql | SÍ |
Sqlite 3 (>= 3.8) | sqlite | SÍ |
Oracle | oci | – |
MS SQL (PDO_SQLSRV) | sqlsrv | SÍ |
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ónNette\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ónNette\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.
