Base de données Nette
Nette Database est une couche de base de données puissante et élégante pour PHP, connue pour sa simplicité et ses fonctionnalités intelligentes. Elle ne nécessite pas de configuration complexe ou de génération d'entités, ce qui vous permet de commencer à travailler avec elle immédiatement.
Avec Nette Database, vous pouvez travailler de deux manières :
Direct SQL
- Requêtes sûres et paramétrées
- Contrôle précis de la structure des requêtes SQL
- Idéal pour écrire des requêtes complexes avec des fonctions avancées
- Optimisation des performances à l'aide de fonctions SQL spécifiques
Explorateur
- Développement rapide sans écrire de SQL
- Gestion intuitive des relations entre les tables
- Optimisation automatique des requêtes
- Idéal pour des interactions rapides et pratiques avec la base de données
Installation
Vous pouvez télécharger et installer la bibliothèque à l'aide de Composer:
composer require nette/database
Connexion et configuration
Pour se 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) suit le même format que celui utilisé par PDO, par exemple
host=127.0.0.1;dbname=test
. En cas d'échec de la connexion, la classe
Nette\Database\ConnectionException
.
Cependant, une méthode plus pratique consiste à utiliser la configuration de l'application. Ajoutez une section
database
, et les objets nécessaires seront créés, y compris un panneau de base de données dans la barre de
débogage de Tracy.
database:
dsn: 'mysql:host=127.0.0.1;dbname=test'
user: root
password: password
Ensuite, l'objet de connexion peut être récupéré en tant que service à partir du conteneur DI, par exemple :
class Model
{
public function __construct(
private Nette\Database\Connection $database,
) {
}
}
Pour plus d'informations, voir la configuration de la base de données.
Deux approches du travail sur les bases de données
Avec Nette Database, vous pouvez soit écrire des requêtes SQL directement (approche directe), soit laisser SQL être généré automatiquement (approche exploratrice). Voyons comment les deux approches résolvent les mêmes tâches :
Approche directe – Écriture de requêtes SQL
// Insérer un enregistrement
$database->query('INSERT INTO books', [
'author_id' => $authorId,
'title' => $bookData->title,
'published_at' => new DateTime,
]);
// Récupérer des enregistrements: auteurs 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 (non optimal, génère N requêtes supplémentaires)
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";
}
}
Approche exploratoire – Génération automatique de requêtes SQL
// Insérer un enregistrement
$database->table('books')->insert([
'author_id' => $authorId,
'title' => $bookData->title,
'published_at' => new DateTime,
]);
// Récupérer des enregistrements: auteurs de livres
$authors = $database->table('authors')
->where('active', 1);
// Affichage (génère automatiquement seulement 2 requêtes optimisées)
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";
}
}
L'approche Explorer génère et optimise automatiquement les requêtes SQL. Dans l'exemple ci-dessus, l'approche directe génère N+1 requêtes (une pour les auteurs et une pour les livres de chaque auteur), alors que l'approche Explorer n'effectue que deux requêtes optimisées – une pour les auteurs et une autre pour tous leurs livres.
Vous pouvez librement combiner les deux approches dans votre application selon vos besoins.
Gestion des connexions
Lorsque vous créez un objet Connection
, il se connecte automatiquement à la base de données. Si vous souhaitez
retarder la connexion, activez le mode paresseux dans la configuration en définissant lazy
, ou procédez comme
suit :
$database = new Nette\Database\Connection($dsn, $user, $password, ['lazy' => true]);
Pour gérer la connexion, utilisez les méthodes connect()
, disconnect()
, et
reconnect()
.
connect()
établit une connexion si elle n'a pas déjà été établie et peut lancer unNette\Database\ConnectionException
.disconnect()
se déconnecte de la base de données.reconnect()
se déconnecte puis se reconnecte à la base de données et peut également générer une erreurNette\Database\ConnectionException
.
En outre, vous pouvez surveiller les événements de connexion à l'aide de l'événement onConnect
, qui est un
tableau de rappels exécutés après la connexion à la base de données.
// Appelé après la connexion à la base de données
$database->onConnect[] = function($database) {
echo "Connected to the database";
};
Barre de débogage Tracy
Si vous utilisez Tracy, le panneau Base de données de la barre de débogage est automatiquement activé. Il affiche toutes les requêtes exécutées, leurs paramètres, le temps d'exécution et l'endroit du code où elles ont été appelées.
Bases de données prises en charge
Nette Database supporte les bases de données suivantes :
Nette Database prend en charge les bases de données suivantes : Serveur de base de données Nom DSN Support Explorateur **Serveur de base de données | ||
---|---|---|
MySQL (>= 5.1) | mysql | YES |
PostgreSQL (>= 9.0) | pgsql | OUI | OUI | OUI | NON SQLite 3 (>= 3.8) | sqlite | OUI | OUI | SQLite 3 (>= 3.8) | sqlite | OUI | OUI | OUI | OUI SQLite 3 (>= 3.8) | sqlite | OUI | Oracle | oci | NON MS SQL (PDO_SQLSRV) | sqlsrv | OUI | OUI | NON MS SQL (PDO_SQLSRV) | sqlsrv | OUI | MS SQL (PDO_DBLIB) | mssql | NON MS SQL (PDO_DBLIB) | mssql | NON | ODBC | odbc | NON