需求
A项目,需要获取B、C项目的数据表的字段结构,用于实现自定义列表。
解决方法
- 在A项目配置B项目数据库的账号密码,用于连接B数据库。
- 在.env文件中
DB_CONNECTION=mysql_sea
DB_PORT=3306
DB_HOST_B=127.0.0.1
DB_DATABASE_B=information_schema
DB_USERNAME_B=root
DB_PASSWORD_B=
注意这里连接的是information_schema这个库。【INFORMATION_SCHEMA 数据库】 是MySQL自带的,它提供了访问数据库 元数据 的方式。什么是 元数据 呢?元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。不清楚的,可以打开这个库的column表看看,就懂了。
- 在config/database.php中
'mysql_B' => [
'driver' => 'mysql',
'host' => env('DB_HOST_B', 'localhost'),
'port' => env('DB_PORT_B', '3306'),
'database' => env('DB_DATABASE_B', 'forge'),
'username' => env('DB_USERNAME_B', 'forge'),
'password' => env('DB_PASSWORD_B', ''),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
'engine' => null,
'prefix' => ''
],
- 下面是获取代码
//获取其他数据库连接
$databases = array_where(config('database')['connections'], function ($value,$key) {
return $value && strstr($key,'mysql_') ;
});
$data = [];
foreach($databases as $connectName => $value){
//这里是把需要获取的B数据库名写在连接名后面,即mysql_B
$base = last(explode('_',$connectName));
$tmp = \DB::connection( $connectName)->select("
select TABLE_SCHEMA,COLUMN_NAME,TABLE_NAME,COLUMN_COMMENT
from information_schema.COLUMNS
where TABLE_SCHEMA = '{$base}' "
);
$collection = collect( $tmp);
$database = $collection->first()->TABLE_SCHEMA;
$data[$database] = $collection->groupBy('TABLE_NAME')->toArray();
}
return $data;