Jak korzystać z wielu baz danych w Laravel
Chcę połączyć wiele baz danych w moim systemie. Najczęściej bazą danych jest MySQL, ale w przyszłości może się ona różnić, np. Admin Może generować takie raporty, które są źródłem heterogenicznego systemu bazodanowego.
Więc moje pytanie brzmi Czy Laravel zapewnia jakąś fasadę do radzenia sobie z takimi sytuacjami? Lub jakikolwiek inny framework ma bardziej odpowiednie możliwości dla problemu?
5 answers
Za pomocą .env
>= 5.0 (testowane na 5.5)
W .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
W 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'),
],
Uwaga: W
mysql2
jeśli DB_username i DB_password są takie same, możesz użyćenv('DB_USERNAME')
, który jest metalizowany w.env
pierwszych kilku liniach.
Bez .env
Definiowanie Połączeń
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' => '',
),
),
);
Schemat
Aby określić, którego połączenia użyć, po prostu uruchom metodę connection()
Schema::connection('mysql2')->create('some_table', function($table)
{
$table->increments('id'):
});
Konstruktor Zapytań
$users = DB::connection('mysql2')->select(...);
Wymowne
Ustaw zmienną $connection
w swoim modelu
class SomeModel extends Eloquent {
protected $connection = 'mysql2';
}
Można również zdefiniować połączenie w trybie runtime za pomocą metody setConnection
lub metody statycznej on
:
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;
}
}
Uwaga uważaj na próby budowania relacje z tabelami w bazach danych! Jest to możliwe, ale może pochodzić z pewnymi zastrzeżeniami i zależy od tego, jaką bazę danych i/lub ustawienia bazy danych masz.
Z Laravel Docs
Korzystanie Z Wielu Połączeń Baz Danych
Podczas korzystania z wielu połączeń, można uzyskać dostęp do każdego connection
poprzez metodę podłączenia na DB
fasada. Na name
przekazane do connection
metoda powinna odpowiadają jednemu z połączeń wymienionych w Twoim config/database.php
plik konfiguracyjny:
$users = DB::connection('foo')->select(...);
Można również uzyskać dostęp do surowej, podstawowej instancji PDO za pomocą metody getPdo na instancji połączenia:
$pdo = DB::connection()->getPdo();
Przydatne Linki
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-14 22:37:54
W Laravel 5.1 podajesz połączenie:
$users = DB::connection('foo')->select(...);
Domyślnie, Laravel używa domyślnego połączenia. To proste, prawda?
Czytaj więcej tutaj: http://laravel.com/docs/5.1/database#accessing-connections
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-06 04:56:24
Właściwie, DB::connection('name')->select(..)
nie działa dla mnie, ponieważ 'nazwa' musi być w podwójnych cudzysłowach:"nazwa"
Mimo to zapytanie select jest wykonywane na moim domyślnym połączeniu. Wciąż próbuję dowiedzieć się, jak przekonać Laravela do działania zgodnie z jego przeznaczeniem: zmienić połączenie.
Edit: rozgryzłem to. Po debugowaniu Laravels DatabaseManager okazało się, że moja baza danych.php (plik konfiguracyjny) (w $this->app) się pomylił. W dziale "połączenia" miałem takie rzeczy jak "baza danych" z wartościami ten, z którego go skopiowałem. W jasnych słowach, zamiast
env('DB_DATABASE', 'name')
I needed to place something like
'myNewName'
Ponieważ wszystkie połączenia były wymienione z tymi samymi wartościami dla bazy danych, nazwy użytkownika, hasła itp. co oczywiście nie ma sensu, jeśli chcę uzyskać dostęp do przynajmniej innej nazwy bazy danych
Dlatego za każdym razem, gdy chciałem wybrać coś z innej bazy danych, zawsze kończyłem w domyślnej bazie danych
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-10 07:46:29
Laravel posiada wbudowaną obsługę wielu systemów bazodanowych, szczegóły połączenia należy podać w config/database.php Plik
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,
],
];
Gdy już to masz, możesz utworzyć dwie klasy modelu bazowego dla każdego połączenia i zdefiniować nazwę połączenia w tych modelach
//BaseModel.php
protected $connection = 'mysql';
//BaseModelOne.php
protected $connection = 'mysqlOne';
Można rozszerzyć te modele, aby utworzyć więcej modeli dla tabel w każdym DB.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-06-21 10:52:30
Możesz również użyć systemu postgres fdw
Https://www.postgresql.org/docs/9.5/postgres-fdw.html
Będziesz mógł podłączyć różne db w postgres. Następnie w jednym zapytaniu możesz uzyskać dostęp do tabel znajdujących się w różnych bazach danych.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-12-23 16:54:50