在OP的请求之后,我提交了第二个答案作为不同的方法。
如果这仅用于数据库连接详细信息,您可以在单个 Laravel 应用程序中使用以下方法与多个数据库连接。
In app/config/database.php
您定义了两个不同的连接。一个用于您的主数据库,您的users
存储表并为每个客户端实例提供一个动态表:
'default' => 'mysql_main',
'connections' => [
'mysql_main' => [
'driver' => 'mysql',
'host' => env('DB_HOST', 'localhost'),
'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,
],
'mysql_company' => [
'driver' => 'mysql',
'host' => env('DB_HOST', 'localhost'),
'port' => env('DB_PORT', '3306'),
'database' => Auth::user()->club->db_name,
'username' => Auth::user()->club->db_user,
'password' => Auth::user()->club->db_pass,
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
'engine' => null,
],
],
正如您所看到的,您实际上不需要从配置文件中读取第二个连接的连接详细信息(它仍然用于获取主数据库的主机、端口和任何常见详细信息),您可以动态传递不同的连接详细信息来自您登录的用户。然而,这将要求您提前为每个用户创建所有数据库。
成功连接到两个数据库后,每次执行查询时都必须选择活动连接。
希望 Schema Builder、Query Builder 和 Eloquent 支持开箱即用:
舍玛生成器
Schema::connection('mysql_company')->create('statisticA', function($table)
{
$table->increments('id'):
});
查询生成器
$companyStatA = DB::connection('mysql_company')->select(...);
雄辩模型
class StatisticA extends Eloquent {
protected $connection = 'mysql_company';
}
控制器
class SomeController extends BaseController {
public function someMethod()
{
$statA = new StatisticA;
$statA->setConnection('mysql_company');
$something = $statA->find(1);
return $something;
}
}
然而,棘手的是定义存储在不同数据库中的模型之间的关系。这是可能的,但它很大程度上取决于您的数据库驱动程序和设置。
我怀疑它能否在不同类型的数据库之间正常运行(例如,MySQL 作为您的主数据库,PostgreSQL 作为您公司的数据库),所以我建议您坚持使用 MySQL 并看看情况如何。