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 veNette\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 daNette\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.
