Cara menggunakan banyak basis data di Laravel

225

Saya ingin menggabungkan beberapa basis data di sistem saya. Sebagian besar waktu database adalah MySQL; tetapi mungkin berbeda di masa depan yaitu Admin dapat menghasilkan laporan seperti itu yang menggunakan sumber sistem database heterogen .

Jadi pertanyaan saya adalah apakah Laravel menyediakan Fasad apa pun untuk menghadapi situasi seperti itu? Atau ada kerangka kerja lain yang memiliki kemampuan lebih cocok untuk masalah itu?

Chintan7027
sumber

Jawaban:

469

Menggunakan .env> = 5.0 (diuji pada 5.5)

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

Di 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'),
],

Catatan: Dalam mysql2jika DB_username dan DB_password sama, maka Anda dapat menggunakan metion env('DB_USERNAME')yang ada di .envbeberapa baris pertama.

Tanpa .env<5.0

Tentukan Koneksi

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'    => '',
        ),
    ),
);

Skema

Untuk menentukan koneksi mana yang akan digunakan, cukup jalankan connection()metode

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

Pembuat Kueri

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

Fasih

Tetapkan $connectionvariabel dalam model Anda

class SomeModel extends Eloquent {

    protected $connection = 'mysql2';

}

Anda juga dapat menentukan koneksi saat runtime melalui setConnectionmetode atau onmetode statis:

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;
    }

}

Catatan Berhati-hatilah dalam mencoba membangun hubungan dengan tabel di seluruh basis data! Itu mungkin dilakukan, tetapi bisa disertai dengan beberapa peringatan dan tergantung pada basis data apa dan / atau pengaturan basis data yang Anda miliki.


Dari Laravel Docs

Menggunakan Banyak Koneksi Database

Saat menggunakan beberapa koneksi, Anda dapat mengakses masing-masing connectionmelalui metode koneksi pada DBfasad. Yang namediteruskan ke connectionmetode harus sesuai dengan salah satu koneksi yang tercantum dalam config/database.phpfile konfigurasi Anda :

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

Anda juga dapat mengakses instance PDO mentah yang mendasarinya menggunakan metode getPdo pada instance koneksi:

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

Tautan yang Berguna

  1. Laravel 5 beberapa koneksi basis data DARI laracasts.com
  2. Hubungkan beberapa basis data dalam laravel FROM tutsnare.com
  3. Banyak Koneksi DB di Laravel FROM fideloper.com
Abdulla Nilam
sumber
1
Anda dapat menggunakan class SomeModel extends Model { dan juga memastikan Anda telah menghapus dapatkan nilai dari file env seperti env('DB_DATABASE', 'name')ketika Anda membuat array konfigurasi DB baru dalam file database.php seperti yang disebutkan @sba
Sadee
1
Hai, saya menggunakan Lumen dan untuk bagian konfigurasi database, saya hanya punya file ".env". Bukan database.php. Jadi bagaimana saya bisa memperbaikinya?
Chanaka De Silva
1
@ChanakaDeSilva Anda baru saja membuat folder config dan file database.php untuk Lumen. Rupanya Lumen terus-menerus memeriksa untuk melihat apakah file itu ada, dan akan menggunakannya jika ada.
Ecksters
2
Terima kasih kawan, saya rasa saya menerima pekerjaan ini sekarang; p
binar
1
@AbdullaNilam some1 datang kepada saya untuk membuat aplikasi multidb pertama kali dipikir adalah saya tidak tahu apakah mungkin sekarang saya tahu itu sederhana; p
binar
12

Di Laravel 5.1, Anda menentukan koneksi:

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

Default, Laravel menggunakan koneksi default. Sederhana, bukan?

Baca lebih lanjut di sini: http://laravel.com/docs/5.1/database#accessing-connections

schellingerht
sumber
dalam Laravel 5.1, bagaimana dengan Eloquent?
Simo
1
@ simo, lihat jawaban Abdulla.
schellingerht
Saya telah menulis artikel lengkap untuk sam, Anda dapat memeriksanya di <a href=" stackcoder.in/posts/… 7.x Beberapa Koneksi Database, Migrasi, Hubungan &
Pertanyaan </a>
6

Sebenarnya, DB::connection('name')->select(..)tidak berfungsi untuk saya, karena 'nama' harus dalam tanda kutip ganda: "nama"

Namun, kueri pemilihan dijalankan pada koneksi default saya. Masih berusaha mencari tahu, bagaimana meyakinkan Laravel untuk bekerja seperti yang dimaksudkan: mengubah koneksi.

Sunting: Saya menemukan jawabannya. Setelah debugging Laravels DatabaseManager ternyata database.php saya (file config) (di dalam $ this-> app) salah. Di bagian "koneksi", saya memiliki hal-hal seperti "database" dengan nilai yang saya salin. Dalam istilah yang jelas, bukan

env('DB_DATABASE', 'name')

Saya perlu menempatkan sesuatu seperti

'myNewName'

karena semua koneksi terdaftar dengan nilai yang sama untuk database, nama pengguna, kata sandi, dll. yang tentu saja tidak masuk akal jika saya ingin mengakses setidaknya nama database lain

Karena itu, setiap kali saya ingin memilih sesuatu dari database lain, saya selalu berakhir di database default saya

sba
sumber
1
Terima kasih! Anda menyelamatkan kewarasan saya. Saya mencoba mencari tahu mengapa semua pertanyaan saya merujuk ke database default. Lalu saya membaca posting Anda dan menyadari, bahwa env selalu mengembalikan nilai .env dan parameter kedua hanyalah mundur yang Laravel tidak gunakan.
Moha
Di luar topik: akan sangat bagus, jika admin tidak akan memanipulasi posting saya. Atau setidaknya menulis pesan pribadi padaku apa dan mengapa mereka ingin berubah. Saya tidak tahu cara mengirim pesan pribadi.
sba
Saya memiliki masalah yang sama, saya mengubah nilainya tetapi bukan kuncinya. Ini berfungsi seperti ini: 'database' => env ('DB_NEW_DATABASE', 'myNewDatabase'). Dicatat dengan baik!
Fellipe Sanches
0

Laravel memiliki dukungan bawaan untuk beberapa sistem basis data, Anda perlu memberikan detail koneksi dalam file config / database.php

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,
        ],
];

Setelah Anda memiliki ini, Anda dapat membuat dua kelas model dasar untuk setiap koneksi dan menentukan nama koneksi dalam model-model tersebut

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

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

Anda dapat memperluas model ini untuk membuat lebih banyak model untuk tabel di setiap DB.

sumit
sumber