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 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.