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 birNette\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 birNette\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 |