Nette Datenbank

Nette Database ist eine leistungsstarke und elegante Datenbankschicht für PHP, die für ihre Einfachheit und intelligenten Funktionen bekannt ist. Sie erfordert keine komplexe Konfiguration oder Entity-Generierung, so dass Sie sofort mit ihr arbeiten können.

Mit Nette Database können Sie auf zwei Arten arbeiten:

Direktes SQL

  • Sichere, parametrisierte Abfragen
  • Präzise Kontrolle über die Struktur von SQL-Abfragen
  • Ideal für das Schreiben komplexer Abfragen mit erweiterten Funktionen
  • Optimieren Sie die Leistung mit spezifischen SQL-Funktionen

Entdecker

  • Schnelle Entwicklung ohne SQL zu schreiben
  • Intuitive Handhabung von Beziehungen zwischen Tabellen
  • Automatische Abfrageoptimierung
  • Großartig für schnelle und bequeme Datenbankinteraktionen

Einrichtung

Sie können die Bibliothek mit Composer herunterladen und installieren:

composer require nette/database

Anschluss und Konfiguration

Um eine Verbindung zur Datenbank herzustellen, erstellen Sie einfach eine Instanz der Klasse Nette\Database\Connection:

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

Der Parameter $dsn (Datenquellenname) hat das gleiche Format wie PDO, z. B. host=127.0.0.1;dbname=test. Wenn die Verbindung fehlschlägt, wird der Fehler Nette\Database\ConnectionException ausgelöst.

Eine bequemere Methode ist jedoch die Verwendung der Anwendungskonfiguration. Fügen Sie einen Abschnitt database hinzu, und die erforderlichen Objekte werden erstellt, einschließlich eines Datenbank-Panels in der Tracy-Debug-Leiste.

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

Danach kann das Verbindungsobjekt als Dienst aus dem DI-Container abgerufen werden, z. B.:

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

Weitere Informationen finden Sie unter Datenbankkonfiguration.

Zwei Herangehensweisen an die Datenbankarbeit

Mit Nette Database können Sie entweder direkt SQL-Abfragen schreiben (Direct approach) oder SQL automatisch generieren lassen (Explorer approach). Schauen wir uns an, wie beide Ansätze dieselben Aufgaben lösen:

Direkter Ansatz – Schreiben von SQL-Abfragen

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

// Datensätze abrufen: Buchautoren
$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
');

// Anzeigen (nicht optimal, erzeugt N zusätzliche Abfragen)
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-Ansatz – Automatische SQL-Generierung

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

// Datensätze abrufen: Buchautoren
$authors = $database->table('authors')
	->where('active', 1);

// Anzeigen (erzeugt automatisch nur 2 optimierte Abfragen)
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";
	}
}

Der Explorer-Ansatz generiert und optimiert SQL-Abfragen automatisch. Im obigen Beispiel erzeugt der direkte Ansatz N+1 Abfragen (eine für Autoren und eine für die Bücher jedes Autors), während der Explorer nur zwei optimierte Abfragen durchführt – eine für Autoren und eine für alle ihre Bücher.

Sie können beide Ansätze in Ihrer Anwendung nach Bedarf frei kombinieren.

Verbindungsmanagement

Wenn Sie ein Connection Objekt erstellen, stellt es automatisch eine Verbindung zur Datenbank her. Wenn Sie die Verbindung verzögern wollen, aktivieren Sie in der Konfiguration den “Lazy Mode”, indem Sie lazy einstellen:

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

Um die Verbindung zu verwalten, verwenden Sie die Methoden connect(), disconnect() und reconnect().

  • connect() baut eine Verbindung auf, wenn sie noch nicht aufgebaut wurde und kann einen Nette\Database\ConnectionException auslösen.
  • disconnect() trennt die Verbindung mit der Datenbank.
  • reconnect() trennt die Verbindung zur Datenbank und stellt sie dann wieder her, wobei auch ein Nette\Database\ConnectionException ausgelöst werden kann.

Zusätzlich können Sie die Verbindungsereignisse mit dem Ereignis onConnect überwachen, das ein Array von Callbacks ist, die nach der Verbindung zur Datenbank ausgeführt werden.

// Wird nach der Verbindung zur Datenbank aufgerufen
$database->onConnect[] = function($database) {
	echo "Connected to the database";
};

Tracy-Debug-Leiste

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

Unterstützte Datenbanken

Nette Database unterstützt die folgenden Datenbanken:

Datenbankserver DSN Name Explorer Support
MySQL (>= 5.1) mysql YES
PostgreSQL (>= 9.0) pgsql YES
SQLite 3 (>= 3.8) sqlite JA
Oracle oci NO
MS SQL (PDO_SQLSRV) sqlsrv JA
MS SQL (PDO_DBLIB) mssql NEIN
ODBC odbc NEIN
Version: 4.0