[Go to site: main page, start]

Nette Database

Nette Database ist eine leistungsfähige und elegante Datenbankschicht für PHP mit dem Fokus auf Einfachheit und intelligente Funktionen. Sie bietet zwei Arten, mit der Datenbank zu arbeiten: den Explorer für die schnelle Anwendungsentwicklung oder den SQL-Weg für die direkte Arbeit mit Queries.

SQL-Weg

  • Sichere, parametrisierte Queries
  • Genaue Kontrolle über den Aufbau der SQL-Queries
  • Wenn Sie komplexe Queries mit fortgeschrittenen Funktionen schreiben
  • Optimierung der Leistung mit spezifischen SQL-Funktionen

Explorer

  • Schnell entwickeln, ohne SQL zu schreiben
  • Intuitive Arbeit mit Beziehungen zwischen Tabellen
  • Automatische Optimierung der Queries nutzen
  • Geeignet für schnelles und bequemes Arbeiten mit der Datenbank

Installation

Die Bibliothek laden und installieren Sie mit Composer:

composer require nette/database

Unterstützte Datenbanken

Nette Database unterstützt die folgenden Datenbanken:

Datenbankserver DSN-Name Explorer-Unterstützung
MySQL (>= 5.1) mysql JA
PostgreSQL (>= 9.0) pgsql JA
SQLite 3 (>= 3.8) sqlite JA
Oracle oci NEIN
MS SQL (PDO_SQLSRV) sqlsrv JA
MS SQL (PDO_DBLIB) mssql NEIN
ODBC odbc NEIN

Zwei Zugänge zur Datenbank

Nette Database lässt Ihnen die Wahl: Sie können SQL-Queries entweder direkt schreiben (SQL-Weg) oder sie automatisch generieren lassen (Explorer). Sehen wir uns an, wie beide Zugänge dieselben Aufgaben lösen:

SQL-Weg – SQL-Queries

// Einfügen eines Datensatzes
$database->query('INSERT INTO books', [
	'author_id' => $authorId,
	'title' => $bookData->title,
	'published_at' => new DateTime,
]);

// Laden von Datensätzen: Autoren der Bücher
$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
');

// Ausgabe (nicht optimal, erzeugt N weitere Queries)
foreach ($result as $author) {
	$books = $database->query('
		SELECT * FROM books
		WHERE author_id = ?
		ORDER BY published_at DESC
	', $author->id);

	echo "Autor $author->name hat $author->books_count Bücher geschrieben:\n";

	foreach ($books as $book) {
		echo "- $book->title\n";
	}
}

Explorer-Weg – automatische SQL-Generierung

// Einfügen eines Datensatzes
$database->table('books')->insert([
	'author_id' => $authorId,
	'title' => $bookData->title,
	'published_at' => new DateTime,
]);

// Laden von Datensätzen: Autoren der Bücher
$authors = $database->table('authors')
	->where('active', 1);

// Ausgabe (erzeugt automatisch nur 2 optimierte Queries)
foreach ($authors as $author) {
	$books = $author->related('books')
		->order('published_at DESC');

	echo "Autor $author->name hat {$books->count()} Bücher geschrieben:\n";

	foreach ($books as $book) {
		echo "- $book->title\n";
	}
}

Der Explorer-Zugang erzeugt und optimiert die SQL-Queries automatisch. Im obigen Beispiel erzeugt der SQL-Weg N+1 Queries (eine für die Autoren und dann eine für die Bücher jedes Autors), während der Explorer die Queries automatisch optimiert und nur zwei ausführt – eine für die Autoren und eine für alle ihre Bücher.

Beide Zugänge lassen sich in der Anwendung nach Bedarf beliebig kombinieren.

Verbindung und Konfiguration

Um sich mit der Datenbank zu verbinden, genügt es, eine Instanz der Klasse Nette\Database\Connection zu erzeugen:

$database = new Nette\Database\Connection($dsn, $user, $password);

Der Parameter $dsn (Data Source Name) ist derselbe, den PDO verwendet, also z. B. host=127.0.0.1;dbname=test. Im Fehlerfall wird eine Nette\Database\ConnectionException geworfen.

Bequemer ist jedoch der Weg über die Anwendungskonfiguration, in der Sie nur den Abschnitt database ergänzen müssen. Dadurch entstehen die nötigen Objekte und außerdem ein Datenbank-Panel in der Tracy Bar.

database:
	dsn: 'mysql:host=127.0.0.1;dbname=test'
	user: root
	password: password

Das Verbindungsobjekt lässt sich danach als Service aus dem DI-Container beziehen, z. B.:

class Model
{
	public function __construct(
		// oder Nette\Database\Explorer
		private Nette\Database\Connection $database,
	) {
	}
}

Mehr Informationen zur Datenbankkonfiguration.

Manuelle Erstellung des Explorers

Wenn Sie den Nette DI-Container nicht verwenden, können Sie eine Instanz von Nette\Database\Explorer manuell erzeugen:

// Verbindung zur Datenbank
$connection = new Nette\Database\Connection('mysql:host=127.0.0.1;dbname=mydatabase', 'user', 'password');
// Speicher für den Cache, implementiert Nette\Caching\Storage, z. B.:
$storage = new Nette\Caching\Storages\FileStorage('/path/to/temp/dir');
// kümmert sich um die Reflexion der Datenbankstruktur
$structure = new Nette\Database\Structure($connection, $storage);
// definiert die Regeln für das Mapping von Tabellen-, Spalten- und Fremdschlüsselnamen
$conventions = new Nette\Database\Conventions\DiscoveredConventions($structure);
$explorer = new Nette\Database\Explorer($connection, $structure, $conventions, $storage);

Verbindungsverwaltung

Beim Erzeugen eines Connection-Objekts wird die Verbindung automatisch aufgebaut. Wenn Sie den Verbindungsaufbau verzögern wollen, verwenden Sie den Lazy-Modus – Sie schalten ihn in der Konfiguration mit lazy ein oder so:

$database = new Nette\Database\Connection($dsn, $user, $password, ['lazy' => true]);

Zur Verwaltung der Verbindung dienen die Methoden connect(), disconnect() und reconnect().

  • connect() baut die Verbindung auf, falls sie noch nicht existiert, und kann dabei eine Nette\Database\ConnectionException werfen.
  • disconnect() trennt die aktuelle Verbindung zur Datenbank.
  • reconnect() trennt die Verbindung und baut sie anschließend neu auf. Auch diese Methode kann eine Nette\Database\ConnectionException werfen.

Außerdem können Sie Ereignisse rund um die Verbindung mit dem Event onConnect verfolgen, das ein Array von Callbacks ist, die nach dem Aufbau der Verbindung zur Datenbank aufgerufen werden.

// läuft nach dem Verbinden mit der Datenbank
$database->onConnect[] = function($database) {
	echo "Mit der Datenbank verbunden";
};

Das Event onQuery funktioniert ähnlich – es ist ein Array von Callbacks, die nach jeder ausgeführten Query aufgerufen werden (auch wenn sie fehlschlägt), was sich für Logging oder Profiling eignet.

Tracy Debug Bar

Wenn Sie Tracy verwenden, wird das Panel Database in der Debug Bar automatisch aktiviert. Es zeigt alle ausgeführten Queries, ihre Parameter, die Ausführungszeit und die Stelle im Code, an der sie aufgerufen wurden.

Version: 4.x