Laravel 5.2 — Создание различных подключений для чтения / записи

В laravel 5.2 мы хотели иметь разные соединения для чтения / записи, поэтому я следовал совету, как указано в документах laravel. Но по умолчанию это было только создание по умолчанию MySQL именованное соединение, а не 2 разных читай пиши связи, поэтому он выбирал читать подключение для таких операций, как INSERT / UPDATE.

После отладки выяснилось, что в DatabaseManager.php подать имя соединения, переданное в качестве аргумента makeconnection() было MySQL и не mysql :: read или mysql :: write.

До

конфиг / database.php

'mysql' => [
//we need to have this nested options for both read/write
'read' => [
'host' => env('DB_READ_HOST'),
],
'write' => [
'host' => env('DB_WRITE_HOST'),
],
'host' => env('DB_READ_HOST'),
'username'  => env('DB_USERNAME'),
'password'  => env('DB_PASSWORD'),
'driver'    => 'mysql',
'database'  => env('DB_DATABASE'),
'collation' => 'utf8_unicode_ci',
'port'      => env('DB_PORT', '3306'),
'charset'   => 'utf8',
'prefix'    => '',
'strict'    => false,
],

Файл — vendor/laravel/framework/src/Illuminate/Database/DatabaseManager.php

public function connection($name = null)
{
list($name, $type) = $this->parseConnectionName($name);

// If we haven't created this connection, we'll create it based on the config
// provided in the application. Once we've created the connections we will
// set the "fetch mode" for PDO which determines the query return types.
if (! isset($this->connections[$name])) {
$connection = $this->makeConnection($name);

$this->setPdoForType($connection, $type);

$this->connections[$name] = $this->prepare($connection);
}

return $this->connections[$name];
}

Итак, мы добавили небольшое изменение в файл, после добавления он создает два разных соединения mysql.read/mysql.write и переключая их соответственно в соответствии с заданными операциями SQL SELECT, INSERT, UPDATE

Нужна ли вам обратная связь, если это жизнеспособное решение?

После изменения файла

config/database.php

'mysql' => [
//we need to have this nested options for both read/write
'read' => [
'host' => env('DB_READ_HOST'),
'username'  => env('DB_READ_USERNAME'),
'password'  => env('DB_READ_PASSWORD'),
'driver'    => 'mysql',
'database'  => env('DB_DATABASE'),
'collation' => 'utf8_unicode_ci',
'port'      => env('DB_PORT', '3306'),
'charset'   => 'utf8',
'prefix'    => '',
'strict'    => false,
],
'write' => [
'host' => env('DB_WRITE_HOST'),
'username'  => env('DB_WRITE_USERNAME'),
'password'  => env('DB_WRITE_PASSWORD'),
'driver'    => 'mysql',
'database'  => env('DB_DATABASE'),
'collation' => 'utf8_unicode_ci',
'port'      => env('DB_PORT', '3306'),
'charset'   => 'utf8',
'prefix'    => '',
'strict'    => false,

],
'host' => env('DB_READ_HOST'),
'username'  => env('DB_READ_USERNAME'),
'password'  => env('DB_READ_PASSWORD'),
'driver'    => 'mysql',
'database'  => env('DB_DATABASE'),
'collation' => 'utf8_unicode_ci',
'port'      => env('DB_PORT', '3306'),
'charset'   => 'utf8',
'prefix'    => '',
'strict'    => false,
],

Файл — vendor/laravel/framework/src/Illuminate/Database/DatabaseManager.php

public function connection($name = null)
{
list($name, $type) = $this->parseConnectionName($name);
// we check if the $type is read/write and store appropriate connections
if( $type != null ) {
$name .= '.' . $type;
}
//end

// If we haven't created this connection, we'll create it based on the config
// provided in the application. Once we've created the connections we will
// set the "fetch mode" for PDO which determines the query return types.
if (! isset($this->connections[$name])) {
$connection = $this->makeConnection($name);

$this->setPdoForType($connection, $type);

$this->connections[$name] = $this->prepare($connection);
}

return $this->connections[$name];
}

3

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector