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 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.