Laravel'de birden çok veritabanı nasıl kullanılır


225

Sistemimdeki birden çok veritabanını birleştirmek istiyorum. Çoğu zaman veritabanı MySQL'dir; ancak gelecekte farklılık gösterebilir, yani Yönetici heterojen veritabanı sisteminin kaynağı olan böyle bir rapor oluşturabilir .

Benim sorum Laravel böyle durumlarla başa çıkmak için herhangi bir Cephe sağlıyor mu? Veya başka herhangi bir çerçeve sorun için daha uygun yetenekleri var mı?

Yanıtlar:


471

Kullanma .env> = 5.0 (5.5 ile test edilmiştir)

İçinde .env

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=database1
DB_USERNAME=root
DB_PASSWORD=secret

DB_CONNECTION_SECOND=mysql
DB_HOST_SECOND=127.0.0.1
DB_PORT_SECOND=3306
DB_DATABASE_SECOND=database2
DB_USERNAME_SECOND=root
DB_PASSWORD_SECOND=secret

İçinde config/database.php

'mysql' => [
    'driver'    => env('DB_CONNECTION'),
    'host'      => env('DB_HOST'),
    'port'      => env('DB_PORT'),
    'database'  => env('DB_DATABASE'),
    'username'  => env('DB_USERNAME'),
    'password'  => env('DB_PASSWORD'),
],

'mysql2' => [
    'driver'    => env('DB_CONNECTION_SECOND'),
    'host'      => env('DB_HOST_SECOND'),
    'port'      => env('DB_PORT_SECOND'),
    'database'  => env('DB_DATABASE_SECOND'),
    'username'  => env('DB_USERNAME_SECOND'),
    'password'  => env('DB_PASSWORD_SECOND'),
],

Not: In mysql2DB_username ve DB_password aynı ise, o zaman kullanabilirsiniz env('DB_USERNAME')metioned olan .envilk birkaç satır.

.env<5.0 olmadan

Bağlantıları Tanımlayın

app/config/database.php

return array(

    'default' => 'mysql',

    'connections' => array(

        # Primary/Default database connection
        'mysql' => array(
            'driver'    => 'mysql',
            'host'      => '127.0.0.1',
            'database'  => 'database1',
            'username'  => 'root',
            'password'  => 'secret'
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
        ),

        # Secondary database connection
        'mysql2' => array(
            'driver'    => 'mysql',
            'host'      => '127.0.0.1',
            'database'  => 'database2',
            'username'  => 'root',
            'password'  => 'secret'
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
        ),
    ),
);

Şema

Hangi bağlantıyı kullanacağınızı belirtmek için, connection()yöntemi çalıştırın

Schema::connection('mysql2')->create('some_table', function($table)
{
    $table->increments('id'):
});

Sorgu oluşturucu

$users = DB::connection('mysql2')->select(...);

anlamlı

$connectionDeğişkeni modelinizde ayarlayın

class SomeModel extends Eloquent {

    protected $connection = 'mysql2';

}

Bağlantıyı çalışma zamanında setConnectionyöntem veya onstatik yöntemle de tanımlayabilirsiniz :

class SomeController extends BaseController {

    public function someMethod()
    {
        $someModel = new SomeModel;

        $someModel->setConnection('mysql2'); // non-static method

        $something = $someModel->find(1);

        $something = SomeModel::on('mysql2')->find(1); // static method

        return $something;
    }

}

Not: Veritabanları arasında tablolarla ilişki kurmaya çalışırken dikkatli olun! Bunu yapmak mümkündür, ancak bazı uyarılarla birlikte gelebilir ve sahip olduğunuz veritabanı ve / veya veritabanı ayarlarına bağlıdır.


Laravel Docs sitesinden

Birden Çok Veritabanı Bağlantısı Kullanma

Birden fazla bağlantı kullanırken, her birine cephedeki connectionbağlantı yöntemiyle erişebilirsiniz DB. nameGeçirilen connectionyöntemde sizin listelenen bağlantılarından birine karşılık gelmelidir config/database.phpyapılandırma dosyası:

$users = DB::connection('foo')->select(...);

Bir bağlantı örneğindeki getPdo yöntemini kullanarak ham, temel alınan PDO örneğine de erişebilirsiniz:

$pdo = DB::connection()->getPdo();

kullanışlı bağlantılar

  1. Laravel 5 çoklu veritabanı bağlantısı laracasts.com
  2. Laravel FROM'dan birden fazla veritabanı bağlayın tutsnare.com
  3. Laravel'den Çoklu DB Bağlantıları fideloper.com

1
@Sba'nın belirttiği gibi database.php dosyasında yeni DB yapılandırma dizisi oluştururken class SomeModel extends Model { olduğu gibi env dosyasından get değerlerini kaldırdığınızdan emin olabilirsinizenv('DB_DATABASE', 'name')
Sadee

1
Hey, Lumen kullanıyorum ve veritabanı yapılandırma kısmı için sadece ".env" dosyası var. Database.php değil. Peki bunu nasıl düzeltebilirim?
Chanaka De Silva

1
@ChanakaDeSilva Lumen için sadece bir yapılandırma klasörü ve bir database.php dosyası oluşturursunuz. Görünüşe göre Lumen, bu dosyanın var olup olmadığını sürekli kontrol ediyor ve varsa kullanacak.
Ecksters

2
Teşekkürler kardeşim şimdi bu işi almayı düşünüyorum; p
binar

1
@AbdullaNilam some1 ilk multidb uygulaması yapmak için bana geldi, şimdi mümkün olduğunu bilmiyorum oldu ben basit biliyorum; p
binar

12

Laravel 5.1'de bağlantıyı belirtirsiniz:

$users = DB::connection('foo')->select(...);

Varsayılan, Laravel varsayılan bağlantıyı kullanır. Çok basit, değil mi?

Daha fazla bilgiyi buradan edinebilirsiniz: http://laravel.com/docs/5.1/database#accessing-connections


Laravel 5.1'de Eloquent'a ne dersiniz?
simo

1
Simo, Abdulla'nın cevabına bakınız.
schellingerht

Sam için <a href=" stackcoder.in/posts/… adresinden kontrol edebileceğiniz eksiksiz bir makale yazdım 7.x Çoklu Veritabanı Bağlantıları,
Göçler,

6

Aslında DB::connection('name')->select(..)benim için çalışmıyor, çünkü 'name' çift tırnak içinde olmalı: "name"

Yine de, seçme sorgusu varsayılan bağlantımda yürütülüyor. Hala anlamaya çalışarak, Laravel'i amaçlandığı şekilde çalışmaya ikna etme: bağlantıyı değiştirme.

Düzenleme: Anladım. Laravels DatabaseManager'da hata ayıkladıktan sonra benim database.php (yapılandırma dosyası) ($ this-> app içinde) yanlış çıktı. "Bağlantılar" bölümünde ben kopyalanan bir değerleri ile "veritabanı" gibi şeyler vardı. Açıkça söylemek gerekirse,

env('DB_DATABASE', 'name')

Gibi bir şey yerleştirmem gerekiyordu

'myNewName'

tüm bağlantılar veritabanı, kullanıcı adı, şifre vb. için aynı değerlerle listelendiğinden, en azından başka bir veritabanı adına erişmek istersem elbette çok az mantıklı.

Bu nedenle, başka bir veritabanından bir şey seçmek istediğimde her zaman varsayılan veritabanımda yer aldım


1
Teşekkür ederim! Aklımı kurtardın. Tüm sorgularımın neden varsayılan veritabanına başvurduğunu anlamaya çalıştım. Sonra yazınızı okudum ve anladım, env her zaman .env değerlerini döndürdü ve ikinci parametre sadece Laravel'in kullanmadığı bir geri dönüş oldu.
Moha

Konu Dışı: Yöneticiler yayınlarımı değiştirmezse harika olur. Ya da en azından bana neyi ve neden değiştirmek istediklerini gösteren özel bir mesaj yaz. Nasıl özel mesaj gönderileceğini bulamadım.
sba

Benzer bir sorunum vardı, değeri değiştirdim ama anahtarı değil. Şöyle çalıştı: 'database' => env ('DB_NEW_DATABASE', 'myNewDatabase'). İyi not!
Fellipe Sanches

0

Laravel, birden fazla veritabanı sistemi için dahili desteğe sahiptir, config / database.php dosyasında bağlantı ayrıntılarını sağlamanız gerekir

return [
    'default' => env('DB_CONNECTION', 'mysql'),

    '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', ''),
            'charset' => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix' => '',
            'strict' => false,
            'engine' => null,
        ],
'mysqlOne' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST_ONE', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE_ONE', 'forge'),
            'username' => env('DB_USERNAME_ONE', 'forge'),
            'password' => env('DB_PASSWORD_ONE', ''),
            'charset' => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix' => '',
            'strict' => false,
            'engine' => null,
        ],
];

Bunu yaptıktan sonra, her bağlantı için iki temel model sınıfı oluşturabilir ve bu modellerde bağlantı adını tanımlayabilirsiniz

//BaseModel.php
protected $connection = 'mysql';

//BaseModelOne.php
protected $connection = 'mysqlOne';

Her DB'deki tablolar için daha fazla model oluşturmak üzere bu modelleri genişletebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.