在 Laravel 中动态更改数据库连接 [重复]
Posted
技术标签:
【中文标题】在 Laravel 中动态更改数据库连接 [重复]【英文标题】:Change the Database Connection Dynamically in Laravel [duplicate] 【发布时间】:2018-03-28 06:24:19 【问题描述】:我的主数据库带有登录表和每个用户的相应数据库设置。登录时,我应该动态更改从表中获取的数据库设置。 我可以更改数据库连接,但这不是持久的。
Config::set("database.connections.mysql", [
'driver' => 'mysql',
"host" => $usr_host,
"database" => $usr_database,
"username" => $usr_username,
"password" => $usr_password,
...
]);
编辑: 当每个用户注册应用程序时,都会为每个用户创建新数据库,因此我没有在 config/database.php 中定义的每个用户的数据库连接
【问题讨论】:
这能回答你的问题吗? Laravel: connect to databases dynamically 【参考方案1】:您可以使用默认数据库进行用户登录,并为数据库名称添加一个新字段。然后,每当您需要查询不同的数据库时,您只需更改您的数据库连接即可。
类似的东西
$someModel = new SomeModel;
$databaseName = "mysql2"; // Dynamically get this value from db
$someModel->setConnection($databaseName);
$something = $someModel->find(1);
您可以在此处阅读有关它的更多信息。 http://fideloper.com/laravel-multiple-database-connections
【讨论】:
如果我不使用模型怎么办,而我只使用 ::table 好吧,这并不优雅,也不推荐它,但更简单的方法是更改 app/config/database.php 中返回的数组。因此,如果满足条件,则添加一些条件,然后返回辅助数据库详细信息,否则您始终返回主数据库详细信息。【参考方案2】:在 laravel 中,你可以在 conf/database 文件的连接数组中创建不同的连接,然后你可以在你的应用程序中执行操作时使用这些连接.
如果您使用 query builder 或 原始表达式,则必须使用 connection ('name') 方法来执行查询,例如:
$users = DB::connection('mysql')
->table('users')
->select(...)
->get();
如果使用eloquent可以在模型文件的connection属性中指定连接的名称,例如:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
/**
* The connection name for the model.
*
* @var string
*/
protected $connection = 'mysql';
您的问题的解决方案可能是您根据文件conf/database中的用户创建了不同类型的连接,并将用户使用的连接名称保存为用户表中的列,当您进行查询时,您将获得用户连接的名称,例如:
$user = User::find(Auth::id());
$connection = $user->connection;
$users = DB::connection($connection)
->table('users')
->select(...)
->get ();
更多信息:
https://laravel.com/docs/5.5/eloquent#eloquent-model-conventions https://laravel.com/docs/5.5/database#read-and-write-connections
【讨论】:
【参考方案3】:您需要先获取配置..然后更改特定字段然后将其设置回来..
$config = Config::get('database.connections.company');
$config['database'] = "company_tenant_$id";
$config['password'] = "test2123";
config()->set('database.connections.company', $config);
【讨论】:
此设置在下一个请求中更改为默认值 我必须在哪里/哪个文件执行此操作?我只是迷路了。请让我知道我可以执行此操作的确切文件路径。我只想能够做一次,然后我不再需要在每个类和容器中每次都做。【参考方案4】:这样你可以在数据库中设置新的参数:
\Config::set('database.connections.mysql.database', $schemaName);
记住PURGE
以保留此设置
DB::purge('mysql');
干杯!
【讨论】:
DB类的purge函数很有用。 您的回答对我很有帮助,非常感谢。有一种情况是我们只需要更改连接数据库名称,因为我们可能有相同的连接但有多个数据库【参考方案5】:我认为更改数据库连接位置的好地方是bootstrap/app.php
文件,使用下面的代码:
$app->afterBootstrapping(\Illuminate\Foundation\Bootstrap\LoadConfiguration::class, function ($ap)
// your database connection change may happens here
);
它是在ServiceProvider注册和启动之前,所以即使你在ServiceProvider中使用DB
或Eloquent
人员,它也能很好地工作。
【讨论】:
但是我需要检查用户是否登录然后我想使用动态数据库连接,否则我想使用默认登录数据库(用户只能查看登录页面和仅此而已) 我刚试过你的方法。我真的很喜欢按照你的方式去做。但是当我想检查用户是否登录时,在该代码块中,它说未定义 Auth 类。如何访问该代码块内的 Auth 类?如果我能够检查用户是否已登录,那么我将为此做好准备。【参考方案6】:经过大量搜索后,我发现它是这样的:
转到这个文件vendor\laravel\framework\src\Illuminate\Auth\Middleware\Authenticate.php
转到方法:protected function authenticate($request, array $guards) 在方法启动后,粘贴以下代码:
if(auth()->check() && !empty( auth()->user()->db_name ))
$dynamic_db_name = auth()->user()->db_name;
$config = \Config::get('database.connections.mysql');
$config['database'] = $dynamic_db_name;
$config['password'] = "Your DB Password";
config()->set('database.connections.mysql', $config);
\DB::purge('mysql');
首先我们检查用户是否使用
auth()->check()
然后,您可能已根据每个用户将 db_name name 或类似的列表添加到您的用户表中。所以在下一个条件下,我确保 db_name 可用:
&& !empty( auth()->user()->db_name )
然后执行后进入if条件我从用户记录中获取db_name并根据用户数据库设置配置,保存配置并使用DB类的purge方法来持久化这个设置。 我真的被它困住了。我不想在每个班级都更改我的数据库连接。所以这就是我得到它的方式。现在我可以在任何地方都使用 Eloquent 和 DB 而没有任何压力。在我的应用程序中,我有一个用于所有用户登录的中心数据库,然后每个组织都有一个不同的数据库。所以在用户登录后,我不需要中心数据库(登录数据库),我只需要用户/组织特定的数据库。所以这就是我让它工作的方式。
【讨论】:
以上是关于在 Laravel 中动态更改数据库连接 [重复]的主要内容,如果未能解决你的问题,请参考以下文章