Giriş yapmadınız.

Duyuru

TÜRKÇE KİTAP DUYURUSU:
Laravel 5 : Laravel 5.1 Güzelliği (Türkçe)
Vue.js 2 : Vue.js 2 Majesteleri (Türkçe)

#1 28.11.2016 17:43:26

thegodfather
Üye
Kayıtlı: 12.12.2014
Mesajlar: 44

Laravel 4.2 Birden Fazla Db ile Çalışmak

Merhaba arkadaşlar geliştirmekte olduğumuz web tabanlı ön muhasebe programı ve bunun yanında müşterilerimize sunduğumu bir çok yan uygulama mevcut.
Her müşterinin veritabanı farklı.
Uygulama web servis mantığına göre çalışıyor.
Frontend tarafında angularjs kullanıyoruz.
Web servise her istek geldiğinde kullanıcı doğrulması yapılıp müşterinin veritabanı tespit ediliyor ve uygulama tespit edilen db ye kullanıcı yetkisine göre yazma silme vs.. işlemelerini yapıyor. Web servis her istek yapıldığında db bilgisi her seferinde doğrulamadan sonra müşteri db erişim için bilgileri run-time olarak set ediliyor.
Bazı yan uygulamalarımızı laravel de yazmak istiyoruz.
Yanı kısacası laravel de run-time olarak db bilgileri nasıl set ediliyor.. Uygulama yaklaşık 200 den fazla veritabanı ile çalışıyor..

app/config/database.php her kullanıcı için manuel db erişim bilgisi oluşturamayız.. Gerçek zamanlı olarak db erişim bilgileri nasıl set edilir. Bu konuda uzaman arkadaşlar yardımcı olabilirmi.

Teşekkürler..

Çevrimdışı

#2 28.11.2016 23:15:25

kazim.karagul
Üye
Kayıtlı: 01.11.2014
Mesajlar: 116

Yanıt: Laravel 4.2 Birden Fazla Db ile Çalışmak

Merhaba,

Denemeden aklımdan yazarak fikir vermek istiyorum. Deneyip sonucunu söylerseniz belki başka yönlendirme de yapabilirim. Uzun süredir 4 serisini kullanmadığım için belki fikrim işine yaramayabilir haberiniz olsun.

Database config içerisinde;

        'mysql99' => [
            'driver' => 'mysql',
            'host' => 'XXX_host',
            'port' => 3306,
            'database' => 'XXX_db',
            'username' => 'XXX_user',
            'password' => 'XXX_pass',
            'charset' => 'utf8',
            'collation' => 'utf8_general_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],

böyle bir db config oluşturun. Bunu dizi çalışma sırasında değiştirileceğimiz için bilgilerinin doğru olmasına gerek yok.

Normalde $users = DB::connection('foo')->select(...); ile db connection bilgisini değiştirip farklı veritabanından veri çekilebiliyor. Bu bilgiden yola çıkarak eğer connection değişmeden önce connection dizi bilgilerini değiştirirsek ihtiyacımızı karşılarız.

$db_config = Config::get('database.mysql99');
$db_config['host'] = 'MÜŞTERİNİN HOST BİLGİSİ';
$db_config['database'] = 'MÜŞTERİNİN DB BİLGİSİ';
$db_config['username'] = 'MÜŞTERİNİN USER BİLGİSİ';
$db_config['password'] = 'MÜŞTERİNİN PASSWORD BİLGİSİ';
// Bilgileri aldık ve güncelledik. Daha kısa kodlar ile yazabilirdik ama uzun olması şu an için daha hayırlı. Başka az tecrübeli arkadaşların da ihtiyacı olursa okurken zorlanmasınlar.
Config::set('database.mysql99', $db_config);
// Oluşan yeni bilgileri çalışma zamanında config içerisinde değiştirdik
DB::setDefaultConnection('mysql99'); 
Bu yöntem ile veritabanının bağlantısını değiştirebilirsiniz. Bunu yaparsanız eğer tüm sorgular yeni veritabanına gidecek. Eğer sitenin kullanıcının istekleri dışındaki verilerini (title, footer bilgileri gibi) sitenin kendinize özel veritabanından çekiyorsanız kesinlikle bunu kullanmayın.
$users = DB::connection('mysql99')->select(...); 
//Bu şekilde sadece o sorgunun bağlantı bilgisini değiştirerek istenilen veri çekilebilir. Diğer tüm istekler aktif veritabanı bağlantısı üzerinden gerçekleşeceği için herhangi bir sıkıntı olmaz.

Tekrar hatırlatayım. Aynen bu şekilde denemedim çünkü ihtiyacım olmadı. Laravel dökümanından ve kendi mantığımdan yararlanarak böyle çözüm ürettim. Şimdilik bir hata göremiyorum.

Eğer tam sonuç elde edebilirseniz kodu paylaşıp diğer ihtiyacı olanlar için de hem ön bilgi hem kaynak kod sağlamış olursunuz.

Değişiklik Sebebi: İmla.

Son düzenleyen kazim.karagul (29.11.2016 06:32:59)

Çevrimdışı

#3 11.12.2016 19:24:57

thegodfather
Üye
Kayıtlı: 12.12.2014
Mesajlar: 44

Yanıt: Laravel 4.2 Birden Fazla Db ile Çalışmak

Yukarıda anlattığınız yönteme yakın bir şekilde sorunu çözdük.
Cevabınız için teşekkürler..

Çevrimdışı

Forum alt kısmı