В 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];
}
Задача ещё не решена.
Других решений пока нет …