我一直在构建一个跟踪统计数据的Web应用程序。 这些统计数据可能因不同的公司而异。
我决定使用一个主数据库来容纳所有的登录凭据,每个公司都有一个单独的数据库。
用户登录后,他们将被重定向到此功能...
/**
* Redirects the user to the appropriate sub link
*/
public function redirect()
{
Config::set('database.connections.club.database', Auth::user()->club->db_name);
if (Auth::user()->person->role_id == 4) {
return Redirect::to('employee/club_manager/home');
}
}
此函数将称为俱乐部数据库的辅助数据库配置设置为等于用户的关联俱乐部。
但是当我稍后尝试访问此配置时...
/**
* Handle an incoming request.
*
* @param IlluminateHttpRequest $request
* @param Closure $next
* @return mixed`enter code here`
*/
public function handle($request, Closure $next)
{
dd(Config::get('database.connections.club.database'));
if (Auth::user()->role->id == 4)
return $next($request);
}
dd() 将返回 '',这是我在 database.php 文件中设置的默认设置。
我的问题是,我如何在请求之间保存配置设置,因为 Config::set 似乎只保存单个请求的设置。
在OP的要求之后,我提交了第二个答案作为不同的方法。
如果这只是为了数据库连接详细信息,则可以在单个Laravel应用程序中对多个数据库连接使用以下方法。
在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,看看这是怎么回事。
好吧,您实际上不能为此使用配置。
在运行时设置的配置值仅为 当前请求,并且不会结转到后续请求。
拉拉维尔文档参考。
解决方法
作为一种黑客解决方法,如果您不愿意使用主数据库来存储公司数据库连接数据,则可以使用可以在运行时更新的自定义配置文件。
这与原始配置文件的工作方式非常相似,它应该持久保存数据。但是,您必须围绕它构建一个控制机制,以保持条目的唯一性和一致性:
在运行时持久更新配置
您也可以为此寻找一个软件包,这样您就不必重新发明轮子。检查 laravel-config-writer(免责声明:从未亲自使用它)。