Cara menggunakan berbilang pangkalan data dalam Laravel
P粉919464207
P粉919464207 2023-10-13 09:54:58
0
2
571

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粉919464207
P粉919464207

membalas semua(2)
P粉957661544

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

P粉340264283

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

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

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)
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!