Neden Çoklu Veritabanı Bağlantıları Kullanılmalı?
Laravel'in çoklu bağlantılar hakkındaki dokümantasyonu hafiftir – hadi bunları biraz dolduralım.
Laravel'de birden fazla veritabanı kullanmak için bağlantılar (connections) yapılandırma dosyasını kullanabilirsiniz. Bu dosya Laravel uygulamanızın config dizininde bulunur.
Bağlantılar dosyasında birden fazla veritabanı bağlantısı tanımlayabilirsiniz. Her bağlantı bir dizi olarak tanımlanmalıdır. Dizi aşağıdaki anahtarları içermelidir:
- driver (sürücü): Kullanılacak veritabanı sürücüsü.
- host (host): Veritabanı sunucusunun ana bilgisayar adı veya IP adresi.
- port (bağlantı noktası): Veritabanı sunucusunun bağlantı noktası numarası.
- database (veritabanı): Veritabanının adı.
- username (kullanıcı adı): Veritabanı bağlantısı için kullanıcı adı.
- password (parola): Veritabanı bağlantısı için parola.
Örneğin, aşağıdaki kod biri MySQL diğeri PostgreSQL için olmak üzere iki veritabanı bağlantısı tanımlar:
return [
'connections' => [
'mysql' => [
'driver' => 'mysql',
'host' => 'localhost',
'port' => 3306,
'database' => 'my_database',
'username' => 'root',
'password' => '',
],
'pgsql' => [
'driver' => 'pgsql',
'host' => 'localhost',
'port' => 5432,
'database' => 'my_database',
'username' => 'postgres',
'password' => '',
],
],
];
Veritabanı bağlantılarınızı tanımladıktan sonra, bunları Laravel kodunuzda kullanabilirsiniz. Bunu yapmak için Veritabanı fasadını (Database facade) kullanabilirsiniz. Veritabanı cephesi veritabanları ile etkileşim için birleşik bir arayüz sağlar.
Veritabanı bağlantıları arasında geçiş yapmak için Veritabanı cephesindeki connection() yöntemini kullanabilirsiniz. connection() yöntemi, argüman olarak veritabanı bağlantısının adını alır.
Örneğin, aşağıdaki kod pgsql veritabanı bağlantısına geçiş yapar:
use Illuminate\Support\Facades\DB;
DB::connection('pgsql');
Bir veritabanı bağlantısına geçtikten sonra, sorguları yürütmek ve veritabanıyla her zamanki gibi etkileşimde bulunmak için kullanabilirsiniz.
Teknik detaylara dalmadan önce, Laravel uygulamanızda neden birden fazla veritabanı bağlantısına ihtiyaç duyabileceğinizi kısaca inceleyelim:
Endişelerin Ayrılması:
Farklı veriler genellikle farklı alanlara (domains) veya hizmetlere (services) aittir. Örneğin, kullanıcı ile ilgili veriler bir veritabanında saklanırken ürün ile ilgili veriler başka bir veritabanında saklanabilir. Bunları farklı veritabanlarına ayırmak, endişelerin net bir şekilde ayrılmasına yardımcı olur.
Performance Optimization:
Verilerinizi birden fazla veritabanına dağıtarak veritabanı performansını optimize edebilirsiniz. Örneğin, okuma ağırlıklı işlemler için özel bir veritabanı ve yazma ağırlıklı işlemler için başka bir veritabanı kullanabilirsiniz.
Bunu için ayrıca Laravelin Okuma ve Yazma Bağlantılarına bakabilirsiniz.
Üçüncü Taraf Entegrasyonları:
Bazen, birincil veritabanı şemanıza uymayan harici veya eski veritabanlarına bağlanmanız gerekebilir. Birden fazla bağlantı, bu veri kaynaklarıyla verimli bir şekilde çalışmanızı sağlar.
Güvenlik:
Birden fazla veritabanı kullanmak, farklı veri türlerini izole ederek uygulamanızın güvenliğini artırabilir. Örneğin, hassas verileri bir veritabanında ve daha az hassas verileri başka bir veritabanında saklayabilirsiniz.
Ölçeklenebilirlik
Birden fazla veritabanı kullanmak, verilerinizi birden fazla sunucuya dağıtmanıza olanak tanıyarak uygulamanızı daha ölçeklenebilir hale getirebilir.
Laravel'de birden fazla veritabanı kullanmak için en iyi uygulamalar (best practices)
- Veritabanı bağlantılarınız için açıklayıcı isimler kullanın: Bu, veritabanı bağlantılarınızı tanımlamayı ve yönetmeyi kolaylaştıracaktır.
- Veritabanı bağlantıları arasında geçiş yapmak için connection() yöntemini kullanın: Bu, sorguları yanlışlıkla yanlış veritabanında yürütmekten kaçınmanıza yardımcı olacaktır.
- Veritabanı şemalarınızı yönetmek için bir veritabanı taşıma sistemi kullanın: Bu, veritabanı şemalarınızı tüm veritabanlarınızda senkronize tutmanıza yardımcı olacaktır.
- Veritabanı bağlantılarınızı yönetmek için bir veritabanı havuzlayıcı kullanmayı düşünün: Bu, veritabanı bağlantılarının açılma ve kapanma sayısını azaltarak uygulamanızın performansını artırabilir.
Şimdi, adım adım bir kılavuzla başlayalım.
Step 1: Configure Database Connections
Laravel'de veritabanı yapılandırması config/database.php
dosyasında yapılır. Birden fazla veritabanı bağlantısı kurmak için, her bir bağlantıyı bu dosyada tanımlamanız gerekir.
// config/database.php
'connections' => [
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
// ...
],
'second_db' => [
'driver' => 'mysql',
'host' => env('SECOND_DB_HOST', '127.0.0.1'),
'port' => env('SECOND_DB_PORT', '3306'),
'database' => env('SECOND_DB_DATABASE', 'forge'),
'username' => env('SECOND_DB_USERNAME', 'forge'),
'password' => env('SECOND_DB_PASSWORD', ''),
// ...
],
// Add more database connections as needed
],
Bu örnekte, iki veritabanı bağlantısı tanımladık: 'mysql' (varsayılan bağlantı) ve 'second_db'. Gerektiğinde, her biri kendi yapılandırmasına sahip daha fazla bağlantı ekleyebilirsiniz.
Step 2: Set Environment Variables
Hassas veritabanı kimlik bilgilerini güvende tutmak için, bunları saklamak üzere Laravel'in ortam dosyasını (.env
) kullanın. .env
dosyanızı açın ve her veritabanı bağlantısı için ortam değişkenlerini ayarlayın.
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=your_database
DB_USERNAME=your_username
DB_PASSWORD=your_password
SECOND_DB_CONNECTION=mysql
SECOND_DB_HOST=127.0.0.1
SECOND_DB_PORT=3306
SECOND_DB_DATABASE=second_database
SECOND_DB_USERNAME=second_username
SECOND_DB_PASSWORD=second_password
Ortam değişkeni adlarının config/database.php
dosyasında tanımlananlarla eşleştiğinden emin olun.
Step 3: Create Models
Ardından, her bir veritabanı bağlantısı için Eloquent modelleri oluşturun. Bunu artisan
komutunu kullanarak yapabilirsiniz:
php artisan make:model User -m
php artisan make:model Product -m
Bu komut her model için model dosyaları ve geçiş dosyaları oluşturur. Oluşturulan model dosyalarında bağlantıyı belirttiğinizden emin olun:
// app/Models/User.php
protected $connection = 'mysql';
// app/Models/Product.php
protected $connection = 'second_db';
Step 4: Run Migrations
Artık her bağlantı için geçişleri ayrı ayrı çalıştırabilirsiniz:
php artisan migrate
php artisan migrate --database=second_db
Bu, ilgili veritabanlarında gerekli tabloları oluşturacaktır.
Schema Builder içinde, Schema cephesini herhangi bir bağlantıyla kullanabilirsiniz. Hangi bağlantının kullanılacağını belirtmek için connection() yöntemini çalıştırmanız yeterlidir:
Schema::connection('mysql2')->create('some_table', function($table)
{
$table->increments('id'):
});
Step 5: Query Data from Multiple Databases
Artık Eloquent kullanarak birden fazla veritabanından veri sorgulayabilirsiniz. İşte iki veritabanımızdan kullanıcıların ve ürünlerin nasıl alınacağına dair bir örnek:
use App\Models\User;
use App\Models\Product;
// Retrieve users from the 'mysql' database
$users = User::all();
// Retrieve products from the 'second_db' database
$products = Product::all();
Laravel, modelin bağlantı özelliğine göre sorgularınızı doğru veritabanına yönlendirmekle ilgilenir.
Bağlantıyı setConnection yöntemi aracılığıyla çalışma zamanında da tanımlayabilirsiniz.
<?php
class SomeController extends BaseController {
public function someMethod()
{
$someModel = new SomeModel;
$someModel->setConnection('mysql2');
$something = $someModel->find(1);
return $something;
}
}
Son olarak, bir model::on() işlevini statik olarak çağırabilirsiniz:
function handle()
{
Subscription::on('mysql2')
->where('stripe_id', 'sub_xyz')
->get();
}
Şema Oluşturucu'ya (Schema Builder) benzer şekilde, Sorgu Oluşturucu'da (Query Builder) bir bağlantı tanımlayabilirsiniz:
$users = DB::connection('mysql2')->select(...);
Dinamik Bağlantı
Bağlantıları dinamik olarak ele almanız gerekiyorsa, örneğin çok kiracılı bir veritabanı kurulumunda, hangi veritabanı bağlantısının kullanılacağını dinamik olarak ayarlamak için (belki de varsayılan olarak) bazı Hizmet Sağlayıcı (Service Provider) mantığı kullanmayı düşünüyor olabilirsiniz.
Db hizmetini çözümlerken bir bağlantı ayarlamak için Laravel'in Konteyner Olaylarına (Container Events) bağlanmak yararlı olabilir:
// Perhaps within app/Providers/AppServiceProvider.php
use Illuminate\Database\DatabaseManager;
use Illuminate\Contracts\Foundation\Application;
$this->app->resolving('db', function(DatabaseManager $dbManager, Application $app) {
$dbManager->setDefaultConnection('some-connection');
});
Benzer şekilde, https://tenancyforlaravel.com ve GitHub reposu aracılığıyla çok kiracılı kurulumlarda da kullanabilirsiniz (veya ipuçlarını arayabilirsiniz).
Gerçek Zamanlı Örnek: Çok Kiracılı Uygulama (Multi-Tenant Application)
Çoklu veritabanı bağlantılarının gücünü göstermek için gerçek zamanlı bir örneği ele alalım: her kiracının kendi veritabanına sahip olduğu çok kiracılı bir uygulama oluşturmak. Bu mimari veri izolasyonu ve ölçeklenebilirlik sağlar.
Kiracı Bağlantısını yapılandırın:
Veritabanı bağlantısını geçerli kiracıya göre dinamik olarak ayarlayın. Bunu ara yazılım veya hizmet sağlayıcılarda yapabilirsiniz.
Anahtarlama Bağlantıları: (Switching Connections)
Çalışma zamanı sırasında bağlantıları değiştirmek için DB
cephesini (facade) kullanın. Örneğin:
DB::connection('tenant_xyz')->table('some_table')->get();
Kiracı Yönetimi: (Tenant Management)
Yeni kiracıları işe alma ve veritabanlarını oluşturma gibi kiracı yönetimini ele almak için mantık uygulayın.
Sonuç:
Laravel'in çoklu veritabanı bağlantısı desteği, onu veri izolasyonu ve ölçeklenebilirlik gerektiren karmaşık web uygulamaları oluşturmak için çok yönlü bir seçim haline getirir. Adım adım kılavuzu takip ederek ve gerçek zamanlı örneği anlayarak, Laravel projelerinizde birden fazla veritabanının gücünden yararlanabilirsiniz. İster çok kiracılı bir uygulama oluşturuyor olun, ister çeşitli veri kaynaklarıyla çalışmanız gerekiyor olsun, Laravel sizi korur.
Kaynaklar
Makale:
Laravel Multiple Database Connectivity: A Step-by-Step Guide - https://arjunamrutiya.medium.com/laravel-multiple-database-connectivity-a-step-by-step-guide-72cecb5d9223
Multiple DB Connections in Laravel - https://fideloper.com/laravel-multiple-database-connections
How to use multiple databases in Laravel - https://medium.com/@miladev95/how-to-use-multiple-databases-in-laravel-274df382fecd
Türkçe Videolar:
Laravel iki Veritabanı Bağlama - https://www.youtube.com/watch?v=uyJHlZxaPNA