Nette Database

Nette Database, basitliğe ve akıllı özelliklere odaklanan, PHP için güçlü ve zarif bir veritabanı katmanıdır. Veritabanıyla çalışmak için iki yol sunar – hızlı uygulama geliştirme için Explorer veya sorgularla doğrudan çalışmak için SQL yaklaşımı.

SQL yaklaşımı

  • Güvenli parametreli sorgular
  • SQL sorgularının şekli üzerinde hassas kontrol
  • Gelişmiş özelliklere sahip karmaşık sorgular yazdığınızda
  • Belirli SQL fonksiyonlarını kullanarak performansı optimize ettiğinizde

Explorer

  • SQL yazmadan hızlı geliştirme yaparsınız
  • Tablolar arasındaki ilişkilerle sezgisel çalışma
  • Otomatik sorgu optimizasyonunu takdir edersiniz
  • Veritabanıyla hızlı ve rahat çalışmak için uygundur

Kurulum / Yükleme

Kütüphaneyi Composer aracıyla indirip kurabilirsiniz:

composer require nette/database

Desteklenen veritabanları

Nette Database 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
MS SQL (PDO_SQLSRV) sqlsrv EVET
MS SQL (PDO_DBLIB) mssql
ODBC odbc

Veritabanına iki yaklaşım

Nette Database size bir seçenek sunar: SQL sorgularını doğrudan yazabilir (SQL yaklaşımı) veya otomatik olarak oluşturulmalarını sağlayabilirsiniz (Explorer). Her iki yaklaşımın da aynı görevleri nasıl çözdüğüne bakalım:

SQL yaklaşımı – SQL sorguları

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

// kayıtları alma: 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
');

// çıktı (optimal değil, N tane daha sorgu üretir)
foreach ($result as $author) {
	$books = $database->query('
		SELECT * FROM books
		WHERE author_id = ?
		ORDER BY published_at DESC
	', $author->id);

	echo "Yazar $author->name, $author->books_count kitap yazdı:\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ı alma: kitap yazarları
$authors = $database->table('authors')
	->where('active', 1);

// çıktı (otomatik olarak sadece 2 optimize edilmiş sorgu üretir)
foreach ($authors as $author) {
	$books = $author->related('books')
		->order('published_at DESC');

	echo "Yazar $author->name, {$books->count()} kitap yazdı:\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 yaklaşımı N+1 sorgu üretir (biri yazarlar için ve sonra her yazarın kitapları için bir tane), Explorer ise sorguları otomatik olarak optimize eder ve yalnızca iki tane yürütür – biri yazarlar için ve biri tüm kitapları için.

Her iki yaklaşım da uygulamada ihtiyaca göre serbestçe birleştirilebilir.

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ığı ile aynıdır, örn. host=127.0.0.1;dbname=test. Başarısızlık durumunda Nette\Database\ConnectionException istisnası fırlatır.

Ancak, uygulama yapılandırması daha kullanışlı bir yol sunar; buraya sadece database bölümünü eklemeniz yeterlidir ve gerekli nesneler oluşturulur ve ayrıca Tracy çubuğunda veritabanı paneli de oluşturulur.

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

Daha sonra bağlantı nesnesini DI konteynerinden bir servis olarak alırız, örn.:

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

Veritabanı yapılandırması hakkında daha fazla bilgi.

Manuel Explorer Oluşturma

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

// veritabanına bağlanma
$connection = new Nette\Database\Connection('mysql:host=127.0.0.1;dbname=mydatabase', 'user', 'password');
// önbellek için depolama, Nette\Caching\Storage uygular, örn.:
$storage = new Nette\Caching\Storages\FileStorage('/path/to/temp/dir');
// veritabanı yapısının yansımasıyla ilgilenir
$structure = new Nette\Database\Structure($connection, $storage);
// tablo, sütun ve yabancı anahtar adlarının eşleştirilmesi için kuralları tanımlar
$conventions = new Nette\Database\Conventions\DiscoveredConventions($structure);
$explorer = new Nette\Database\Explorer($connection, $structure, $conventions, $storage);

Bağlantı Yönetimi

Connection nesnesi oluşturulduğunda bağlantı otomatik olarak kurulur. Bağlantıyı ertelemek isterseniz, lazy modunu kullanın – bunu yapılandırmada lazy olarak ayarlayarak veya şu şekilde etkinleştirin:

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

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

  • connect() henüz mevcut değilse bir bağlantı oluşturur ve Nette\Database\ConnectionException istisnası fırlatabilir.
  • disconnect() veritabanına olan mevcut bağlantıyı keser.
  • reconnect() bağlantıyı keser ve ardından veritabanına yeniden bağlanır. Bu metot da Nette\Database\ConnectionException istisnası fırlatabilir.

Ayrıca, veritabanıyla bağlantı kurulduktan sonra çağrılacak geri arama (callback) dizisi olan onConnect olayını kullanarak bağlantıyla ilişkili olayları izleyebilirsiniz.

// veritabanına bağlandıktan sonra çalışır
$database->onConnect[] = function($database) {
	echo "Veritabanına bağlandı";
};

Tracy Debug Bar

Tracy kullanıyorsanız, Debug çubuğunda otomatik olarak bir Veritabanı paneli etkinleştirilir; bu panel, yürütülen tüm sorguları, parametrelerini, yürütme sürelerini ve kodda çağrıldıkları yeri gösterir.

versiyon: 4.0