Rumah  >  Soal Jawab  >  teks badan

Cara menggunakan berbilang pangkalan data dalam Laravel

Saya mahu menggabungkan berbilang pangkalan data dalam sistem saya. Selalunya pangkalan data adalah MySQL; tetapi ia mungkin berbeza pada masa hadapan, iaitu pentadbir boleh menjana laporan seperti ini, yang merupakan sumber menggunakan sistem pangkalan data heterogen.

Jadi soalan saya ialah Adakah Laravel menyediakan Facade untuk menangani situasi ini? Atau adakah rangka kerja lain mempunyai ciri yang lebih sesuai dengan masalah?

P粉919464207P粉919464207342 hari yang lalu577

membalas semua(2)saya akan balas

  • P粉957661544

    P粉9576615442023-10-14 00:28:20

    Dalam Laravel 5.1, anda menyatakan sambungan:

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

    Secara lalai, Laravel menggunakan sambungan lalai. Cukup mudah, bukan?

    Baca lebih lanjut di sini: http://laravel.com/docs/5.1/database#visit connection

    balas
    0
  • P粉340264283

    P粉3402642832023-10-14 00:26:49

    Dari dokumentasi Laravel : Anda boleh mengakses setiap sambungan apabila menggunakan berbilang sambungan melalui DB 外观上的连接方法。传递给连接方法的名称应与 config/database.php sepadan dengan salah satu sambungan yang disenaraikan dalam fail konfigurasi:

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

    Tentukan sambungan

    Gunakan .env >= 5.0 (atau lebih tinggi)

    DB_CONNECTION=mysql
    DB_HOST=127.0.0.1
    DB_PORT=3306
    DB_DATABASE=mysql_database
    DB_USERNAME=root
    DB_PASSWORD=secret
    
    DB_CONNECTION_PGSQL=pgsql
    DB_HOST_PGSQL=127.0.0.1
    DB_PORT_PGSQL=5432
    DB_DATABASE_PGSQL=pgsql_database
    DB_USERNAME_PGSQL=root
    DB_PASSWORD_PGSQL=secret

    Gunakan 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'),
    ],
    
    'pgsql' => [
        'driver'    => env('DB_CONNECTION_PGSQL'),
        'host'      => env('DB_HOST_PGSQL'),
        'port'      => env('DB_PORT_PGSQL'),
        'database'  => env('DB_DATABASE_PGSQL'),
        'username'  => env('DB_USERNAME_PGSQL'),
        'password'  => env('DB_PASSWORD_PGSQL'),
    ],

    Tidak .env <= 4.0 (atau lebih rendah)<= 4.0(或更低)

    app/config/database.php

    return array(
        'default' => 'mysql',
        'connections' => array(
            # Primary/Default database connection
            'mysql' => array(
                'driver'    => 'mysql',
                'host'      => '127.0.0.1',
                'database'  => 'mysql_database',
                'username'  => 'root',
                'password'  => 'secret'
                'charset'   => 'utf8',
                'collation' => 'utf8_unicode_ci',
                'prefix'    => '',
            ),
    
            # Secondary database connection
           'pgsql' => [
                'driver' => 'pgsql',
                'host' => 'localhost',
                'port' => '5432',
                'database' => 'pgsql_database',
                'username' => 'root',
                'password' => 'secret',
                'charset' => 'utf8',
                'prefix' => '',
                'schema' => 'public',
            ]
        ),
    );

    Seni bina/Migrasi

    Jalankan kaedah connection() untuk menentukan sambungan yang hendak digunakan.

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

    Sebagai alternatif, tentukan sambungan di bahagian atas.

    protected $connection = 'pgsql';

    Pembina Pertanyaan

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

    Model

    (dalam Laravel >= 5.0 (atau lebih tinggi))

    Tetapkan $connectionpembolehubah

    dalam model
    class ModelName extends Model { // extend changed
    
        protected $connection = 'pgsql';
    
    }

    fasih

    (dalam Laravel <= 4.0 (atau lebih rendah)) <= 4.0(或更低)中)

    Tetapkan $connectionpembolehubah

    dalam model
    class SomeModel extends Eloquent {
        protected $connection = 'pgsql';
    }

    Mod Dagangan

    DB::transaction(function () {
        DB::connection('mysql')->table('users')->update(['name' => 'John']);
        DB::connection('pgsql')->table('orders')->update(['status' => 'shipped']);
    });

    atau

    DB::connection('mysql')->beginTransaction();
    try {
        DB::connection('mysql')->table('users')->update(['name' => 'John']);
        DB::connection('pgsql')->beginTransaction();
        DB::connection('pgsql')->table('orders')->update(['status' => 'shipped']);
        DB::connection('pgsql')->commit();
        DB::connection('mysql')->commit();
    } catch (\Exception $e) {
        DB::connection('mysql')->rollBack();
        DB::connection('pgsql')->rollBack();
        throw $e;
    }

    Anda juga boleh menentukan sambungan pada masa jalan melalui setConnection 方法或 on kaedah statik:

    class SomeController extends BaseController {
        public function someMethod()
        {
            $someModel = new SomeModel;
            $someModel->setConnection('pgsql'); // non-static method
            $something = $someModel->find(1);
            $something = SomeModel::on('pgsql')->find(1); // static method
            return $something;
        }
    }

    Versi Beta (dikemas kini)

    Versi Diuji (T/T)
    4.2 Tidak
    5 Ya (5.5)
    6 Tidak
    7 Tidak
    8 Ya (8.4)
    9 Ya (9.2)

    balas
    0
  • Batalbalas