Nette Veritabanı

Nette Database, PHP için basitlik ve akıllı özelliklere odaklanan güçlü ve zarif bir veritabanı katmanıdır. Verilerinizle çalışmak için iki tamamlayıcı yol sunar – hızlı geliştirme için Explorer 'ı veya sorgular üzerinde tam kontrol için SQL yolunu kullanarak.

SQL yolu

  • 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 yolu

  • 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

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

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

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

SQL yolu – 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 yolu – 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, SQL yolu örneği N+1 sorgu üretirken (biri yazarlar için ve biri her yazarın kitapları için), Explorer yalnızca iki optimize edilmiş sorgu gerçekleştirir – biri yazarlar için ve diğeri tüm kitapları için.

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

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(
		// or Nette\Database\Explorer
		private Nette\Database\Connection $database,
	) {
	}
}

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

Explorer'ın Manuel Olarak Oluşturulması

Nette DI konteynerini kullanmıyorsanız, Nette\Database\Explorer adresinin bir örneğini manuel olarak oluşturabilirsiniz:

// 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);

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.

versiyon: 4.0