Nette Database
Nette Database est une couche de base de données puissante et élégante pour PHP, mettant l'accent sur la simplicité et les fonctionnalités intelligentes. Elle offre deux façons de travailler avec la base de données – Explorer pour un développement rapide d'applications, ou l'accès SQL pour travailler directement avec les requêtes.
Accès SQL
- Requêtes paramétrées sécurisées
- Contrôle précis sur la forme des requêtes SQL
- Lorsque vous écrivez des requêtes complexes avec des fonctionnalités avancées
- Vous optimisez les performances en utilisant des fonctions SQL spécifiques
Explorer
- Vous développez rapidement sans écrire de SQL
- Travail intuitif avec les relations entre les tables
- Vous apprécierez l'optimisation automatique des requêtes
- Convient pour un travail rapide et confortable avec la base de données
Installation
Téléchargez et installez la bibliothèque à l'aide de l'outil Composer :
composer require nette/database
Bases de données supportées
Nette Database supporte les bases de données suivantes :
Serveur de base de données | Nom DSN | Support dans Explorer |
---|---|---|
MySQL (>= 5.1) | mysql | OUI |
PostgreSQL (>= 9.0) | pgsql | OUI |
Sqlite 3 (>= 3.8) | sqlite | OUI |
Oracle | oci | – |
MS SQL (PDO_SQLSRV) | sqlsrv | OUI |
MS SQL (PDO_DBLIB) | mssql | – |
ODBC | odbc | – |
Deux approches de la base de données
Nette Database vous donne le choix : écrire directement des requêtes SQL (accès SQL) ou laisser Explorer les générer automatiquement. Voyons comment les deux approches résolvent les mêmes tâches :
Accès SQL – Requêtes SQL
// Insertion d'un enregistrement
$database->query('INSERT INTO books', [
'author_id' => $authorId,
'title' => $bookData->title,
'published_at' => new DateTime,
]);
// Récupération des auteurs actifs avec le nombre de livres
$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
');
// Affichage (problème N+1 : génère N requêtes supplémentaires pour les livres)
foreach ($result as $author) {
$books = $database->query('
SELECT * FROM books
WHERE author_id = ?
ORDER BY published_at DESC
', $author->id);
echo "L'auteur $author->name a écrit $author->books_count livres :\n";
foreach ($books as $book) {
echo "- $book->title\n";
}
}
Approche Explorer – Génération automatique de SQL
// Insertion d'un enregistrement
$database->table('books')->insert([
'author_id' => $authorId,
'title' => $bookData->title,
'published_at' => new DateTime,
]);
// Récupération des auteurs actifs
$authors = $database->table('authors')
->where('active', 1);
// Affichage (optimisé : génère seulement 2 requêtes au total)
foreach ($authors as $author) {
$books = $author->related('books')
->order('published_at DESC');
echo "L'auteur $author->name a écrit {$books->count()} livres :\n";
foreach ($books as $book) {
echo "- $book->title\n";
}
}
L'approche Explorer génère et optimise automatiquement les requêtes SQL. Dans l'exemple ci-dessus, l'accès SQL souffre du problème “N+1” (une requête pour les auteurs, puis une requête par auteur pour ses livres), tandis qu'Explorer optimise cela en seulement deux requêtes au total : une pour les auteurs et une pour tous leurs livres associés.
Vous pouvez combiner librement les deux approches dans votre application selon vos besoins.
Connexion et configuration
Pour vous connecter à la base de données, il suffit de créer une instance de la classe Nette\Database\Connection :
$database = new Nette\Database\Connection($dsn, $user, $password);
Le paramètre $dsn
(Data Source Name) est le même que celui utilisé par PDO. En cas d'échec de
connexion, une exception Nette\Database\ConnectionException
est levée.
Cependant, la méthode recommandée est d'utiliser la configuration
de l'application (fichier NEON). Ajoutez simplement une section database
, et Nette DI créera automatiquement les
services nécessaires (Connection
et Explorer
), ainsi que le panneau de base de données dans la barre
de débogage Tracy.
database:
dsn: 'mysql:host=127.0.0.1;dbname=test'
user: root
password: password
Ensuite, vous obtenez l'objet de connexion ou l'Explorer en tant que service via l'injection de dépendances :
class Model
{
public function __construct(
// ou Nette\Database\Explorer
private Nette\Database\Connection $database,
) {
}
}
Consultez la section sur la configuration de la base de données pour plus de détails.
Création manuelle de l'Explorer
Si vous n'utilisez pas Nette DI, vous pouvez créer manuellement une instance de Nette\Database\Explorer
:
// connexion à la base de données
$connection = new Nette\Database\Connection('mysql:host=127.0.0.1;dbname=mydatabase', 'user', 'password');
// stockage pour le cache, implémente Nette\Caching\Storage, par ex. :
$storage = new Nette\Caching\Storages\FileStorage('/path/to/temp/dir');
// s'occupe de la réflexion de la structure de la base de données
$structure = new Nette\Database\Structure($connection, $storage);
// définit les règles de mappage des noms de tables, colonnes et clés étrangères
$conventions = new Nette\Database\Conventions\DiscoveredConventions($structure);
$explorer = new Nette\Database\Explorer($connection, $structure, $conventions, $storage);
Gestion de la connexion
Lors de la création de l'objet Connection
, la connexion est établie automatiquement. Si vous souhaitez différer
la connexion, utilisez le mode lazy – activez-le dans la configuration en définissant lazy
, ou comme ceci :
$database = new Nette\Database\Connection($dsn, $user, $password, ['lazy' => true]);
Pour gérer la connexion, utilisez les méthodes connect()
, disconnect()
et
reconnect()
.
connect()
crée la connexion si elle n'existe pas encore, et peut lever une exceptionNette\Database\ConnectionException
.disconnect()
déconnecte la connexion actuelle à la base de données.reconnect()
effectue une déconnexion puis une reconnexion à la base de données. Cette méthode peut également lever une exceptionNette\Database\ConnectionException
.
De plus, vous pouvez surveiller les événements liés à la connexion en utilisant l'événement onConnect
, qui
est un tableau de callbacks appelés après l'établissement de la connexion à la base de données.
// s'exécute après la connexion à la base de données
$database->onConnect[] = function($database) {
echo "Connecté à la base de données";
};
Barre de débogage Tracy
Si vous utilisez Tracy, le panneau Database s'active automatiquement dans la barre de débogage, affichant toutes les requêtes exécutées, leurs paramètres, leur temps d'exécution et l'endroit dans le code où elles ont été appelées.
