最佳方式在Laravel中连接多个数据库。
最佳方式在Laravel中连接多个数据库。
这个问题已经有答案了:
我正在创建一个多租户应用程序,根据子域名连接到特定租户的数据库。
下面是连接数据库的代码:
// To connect with a subdomain - the entry will be in config/database.php. public static function connectSubdomainDatabase($dbname) { $res = DB::select("show databases like '{$dbname}'"); if (count($res) == 0) { App::abort(404); } Config::set('database.connections.subdomain.database', $dbname); //If you want to use query builder without having to specify the connection Config::set('database.default', 'subdomain'); DB::reconnect('subdomain'); }
这是连接数据库的最佳方式,还是因为每次有不同的子域名时我连接数据库会有问题?从性能角度考虑,最好的做法是什么?
admin 更改状态以发布 2023年5月24日
这几乎是做这件事的最佳方法。最终,这都是观点的问题。但是,在配置文件中为每个子域创建一个连接。然后,在connectSubdomainDatabase()函数中,我会获取当前子域,而不是传递数据库名称。在Laravel中已经可以指定连接,您应该只在配置文件中使用数据库名称。
所以,像这样:
// To connect with a subdomain - the entry will be in config/database.php. public static function connectSubdomainDatabase() { // Break apart host $urlParts = explode('.', $_SERVER['HTTP_HOST']); // Change default connection Config::set('database.default', $urlParts[0]); }
其中config/database.php连接为:
'connections' => [ 'subdomain1' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', 'localhost'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', 'strict' => false, ], 'subdomain2' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', 'localhost'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', 'strict' => false, ], ],