最近做项目掉进一个深坑,以至于一个小问题烦恼我两天以至于怀疑人生。
新项目需要连接两个mysql数据库,然而却出现无论如何也查询不了第二个数据库的情况。
经历了多次断点调试,google无止境搜索,询问印度阿三无果的情况下,也只能查看源码解决问题了。
最终发现在laravel的ConnectionFactory类的createConnection方法中有这么一段
protected function createConnection($driver, $connection, $database, $prefix = '', array $config = [])
{
if ($this->container->bound($key = "db.connection.{$driver}")) {
return $this->container->make($key, [$connection, $database, $prefix, $config]);
}
switch ($driver) {
case 'mysql':
return new MySqlConnection($connection, $database, $prefix, $config);
case 'pgsql':
return new PostgresConnection($connection, $database, $prefix, $config);
case 'sqlite':
return new SQLiteConnection($connection, $database, $prefix, $config);
case 'sqlsrv':
return new SqlServerConnection($connection, $database, $prefix, $config);
}
throw new InvalidArgumentException("Unsupported driver [$driver]");
}
$this->container->bound($key = "db.connection.{$driver}")
通过driver去跟容器做了绑定,也就是当你有第二个一样driver的数据库时,调用 $this->container->make()
方法也会同样返回第一个绑定的 connection
,这样无论如何也只能查询第一个了。
修改后
if ($this->container->bound($key = "db.connection.{$driver}.{$config['name']}")) {
return $this->container->make($key, [$connection, $database, $prefix, $config]);
}
通过传入connection
自定义的名称,能够避免重复
只可惜我提PR时对方表示5.3不作bug修复,很诧异。。。
PR在此
issue在此
最近做项目掉进一个深坑,以至于一个小问题烦恼我两天以至于怀疑人生。
新项目需要连接两个mysql数据库,然而却出现无论如何也查询不了第二个数据库的情况。
经历了多次断点调试,google无止境搜索,询问印度阿三无果的情况下,也只能查看源码解决问题了。
最终发现在laravel的ConnectionFactory类的createConnection方法中有这么一段
protected function createConnection($driver, $connection, $database, $prefix = '', array $config = [])
{
if ($this->container->bound($key = "db.connection.{$driver}")) {
return $this->container->make($key, [$connection, $database, $prefix, $config]);
}
switch ($driver) {
case 'mysql':
return new MySqlConnection($connection, $database, $prefix, $config);
case 'pgsql':
return new PostgresConnection($connection, $database, $prefix, $config);
case 'sqlite':
return new SQLiteConnection($connection, $database, $prefix, $config);
case 'sqlsrv':
return new SqlServerConnection($connection, $database, $prefix, $config);
}
throw new InvalidArgumentException("Unsupported driver [$driver]");
}
$this->container->bound($key = "db.connection.{$driver}")
通过driver去跟容器做了绑定,也就是当你有第二个一样driver的数据库时,调用 $this->container->make()
方法也会同样返回第一个绑定的 connection
,这样无论如何也只能查询第一个了。
修改后
if ($this->container->bound($key = "db.connection.{$driver}.{$config['name']}")) {
return $this->container->make($key, [$connection, $database, $prefix, $config]);
}
通过传入connection
自定义的名称,能够避免重复
只可惜我提PR时对方表示5.3不作bug修复,很诧异。。。
PR在此
issue在此