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.
