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 un Nette\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 erreur Nette\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

version: 4.0