Base de données Nette
Nette Database est une couche de base de données puissante et élégante pour PHP, qui met l'accent sur la simplicité et les fonctionnalités intelligentes. Il offre deux façons complémentaires de travailler avec vos données – en utilisant l'explorateur pour un développement rapide, ou la méthode SQL pour un contrôle total des requêtes.
La voie 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
Le chemin de l'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
Bases de données prises en charge
Nette Database prend en charge les bases de données suivantes :
Serveur de base de données | Nom DSN | Support de l'explorateur |
---|
MySQL (>= 5.1) | mysql | OUI | OUI | OUI | OUI | NON PostgreSQL (>= 9.0) | pgsql | OUI | OUI | OUI | NON SQLite 3 (>= 3.8) | sqlite | OUI | OUI | OUI | OUI | OUI | OUI | OUI | 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
Deux approches du travail sur les bases de données
Avec Nette Database, vous pouvez soit écrire des requêtes SQL directement (façon SQL), soit laisser SQL être généré automatiquement (façon Explorer). Voyons comment les deux approches résolvent les mêmes tâches :
Méthode SQL – Écrire des 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";
}
}
Explorer way – Génération automatique de 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'exemple SQL way génère N+1 requêtes (une pour les auteurs et une pour les livres de chaque auteur), alors que l'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.
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(
// or Nette\Database\Explorer
private Nette\Database\Connection $database,
) {
}
}
Pour plus d'informations, voir la configuration de la base de données.
Création manuelle de l'explorateur
Si vous n'utilisez pas le conteneur Nette DI, vous pouvez créer manuellement une instance 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);
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.