Nette Veritabanı

Nette Database, PHP için basitliği ve akıllı özellikleriyle bilinen güçlü ve zarif bir veritabanı katmanıdır. Karmaşık yapılandırma veya varlık oluşturma gerektirmediğinden hemen çalışmaya başlayabilirsiniz.

Nette Veritabanı ile iki şekilde çalışabilirsiniz:

Doğrudan SQL

  • Güvenli, parametrelendirilmiş sorgular
  • SQL sorgularının yapısı üzerinde hassas kontrol
  • Gelişmiş işlevlere sahip karmaşık sorgular yazmak için ideal
  • Belirli SQL işlevlerini kullanarak performansı optimize etme

Kaşif

  • SQL yazmadan hızlı geliştirme
  • Tablolar arasındaki ilişkilerin sezgisel kullanımı
  • Otomatik sorgu optimizasyonu
  • Hızlı ve kullanışlı veritabanı etkileşimleri için ideal

Kurulum

Composer'ı kullanarak kütüphaneyi indirebilir ve yükleyebilirsiniz:

composer require nette/database

Bağlantı ve Yapılandırma

Veritabanına bağlanmak için Nette\Database\Connection sınıfının bir örneğini oluşturmanız yeterlidir:

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

$dsn (Veri Kaynağı Adı) parametresi, PDO'nun kullandığı biçimle aynıdır, örneğin host=127.0.0.1;dbname=test. Bağlantı başarısız olursa, Nette\Database\ConnectionException adresini atar.

Ancak, daha uygun bir yöntem uygulama yapılandırmasını kullanmaktır. Bir database bölümü ekleyin ve Tracy Hata Ayıklama Çubuğunda bir veritabanı paneli de dahil olmak üzere gerekli nesneler oluşturulacaktır.

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

Bundan sonra, bağlantı nesnesi DI konteynerinden bir servis olarak alınabilir, örn:

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

Daha fazla bilgi için, bkz. veritabanı yapılandırması.

Veritabanı Çalışmalarına İki Yaklaşım

Nette Database ile SQL sorgularını doğrudan yazabilir (Doğrudan yaklaşım) ya da SQL'in otomatik olarak oluşturulmasına izin verebilirsiniz (Gezgin yaklaşımı). Her iki yaklaşımın da aynı görevleri nasıl çözdüğünü görelim:

Doğrudan Yaklaşım – SQL Sorguları Yazma

// Kayıt ekleme
$database->query('INSERT INTO books', [
	'author_id' => $authorId,
	'title' => $bookData->title,
	'published_at' => new DateTime,
]);

// Kayıtları getir: kitap yazarları
$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
');

// Görüntüle (optimum değil, N ek sorgu oluşturur)
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 Yaklaşımı – Otomatik SQL Oluşturma

// Kayıt ekleme
$database->table('books')->insert([
	'author_id' => $authorId,
	'title' => $bookData->title,
	'published_at' => new DateTime,
]);

// Kayıtları getir: kitap yazarları
$authors = $database->table('authors')
	->where('active', 1);

// Ekran (otomatik olarak yalnızca 2 optimize edilmiş sorgu oluşturur)
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";
	}
}

Explorer yaklaşımı SQL sorgularını otomatik olarak oluşturur ve optimize eder. Yukarıdaki örnekte, Doğrudan yaklaşım N+1 sorgu üretirken (biri yazarlar ve biri her yazarın kitapları için), Explorer yalnızca iki optimize edilmiş sorgu gerçekleştirir – biri yazarlar ve diğeri tüm kitapları için.

Uygulamanızda her iki yaklaşımı da gerektiği gibi özgürce birleştirebilirsiniz.

Bağlantı Yönetimi

Bir Connection nesnesi oluşturduğunuzda, veritabanına otomatik olarak bağlanır. Bağlantıyı geciktirmek istiyorsanız, lazy adresini ayarlayarak yapılandırmada tembel modu etkinleştirin veya şu şekilde yapın:

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

Bağlantıyı yönetmek için connect(), disconnect() ve reconnect() yöntemlerini kullanın.

  • connect(), daha önce kurulmamışsa bir bağlantı kurar ve bir Nette\Database\ConnectionException atabilir.
  • disconnect() veritabanı bağlantısını keser.
  • reconnect() bağlantısı kesilir ve ardından veritabanına yeniden bağlanır ve ayrıca bir Nette\Database\ConnectionException atabilir.

Ayrıca, veritabanına bağlandıktan sonra yürütülen bir dizi geri arama olan onConnect olayını kullanarak bağlantı olaylarını izleyebilirsiniz.

// Veritabanına bağlandıktan sonra çağrılır
$database->onConnect[] = function($database) {
	echo "Connected to the database";
};

Tracy Hata Ayıklama Çubuğu

Tracy kullanıyorsanız, Hata Ayıklama Çubuğundaki Veritabanı paneli otomatik olarak etkinleştirilir. Yürütülen tüm sorguları, parametrelerini, yürütme süresini ve çağrıldıkları koddaki konumu görüntüler.

Desteklenen Veritabanları

Nette Veritabanı aşağıdaki veritabanlarını destekler:

Veritabanı Sunucusu DSN Adı Explorer Desteği
MySQL (>= 5.1) mysql EVET
PostgreSQL (>= 9.0) pgsql EVET
SQLite 3 (>= 3.8) sqlite EVET
Oracle oci HAYIR
MS SQL (PDO_SQLSRV) sqlsrv EVET
MS SQL (PDO_DBLIB) mssql HAYIR
ODBC odbc HAYIR
versiyon: 4.0