我拥有主数据库,其中包含每个用户的登录表和相应的数据库设置。在登录时,我应该动态更改从表中获取的数据库设置。 我可以更改数据库连接,但这不会持续存在。
Config::set("database.connections.mysql", [
'driver' => 'mysql',
"host" => $usr_host,
"database" => $usr_database,
"username" => $usr_username,
"password" => $usr_password,
...
]);
编辑: 当他/她向应用程序注册时,为每个用户创建新数据库,因此我没有为config / database.php中定义的每个用户建立数据库连接
答案 0 :(得分:3)
这样,您可以在涉及数据库时设置新参数:
\Config::set('database.connections.mysql.database', $schemaName);
记住PURGE
,以保留此设置
DB::purge('mysql');
干杯!
答案 1 :(得分: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
答案 2 :(得分:1)
您需要先获取配置..然后更改特定字段,然后将其重新设置..
public class FindPermutations {
public static void main(String[] args) {
System.out.println(numPerms(new String("xacxzaa"),
new String("fxaazxacaaxzoecazxaxaz")));
System.out.println(numPerms(new String("ABCD"),
new String("BACDGABCDA")));
System.out.println(numPerms(new String("AABA"),
new String("AAABABAA")));
// prints 4, then 3, then 3
}
public static int numPerms(final String a, final String b) {
int sum = 0;
for (int i = 0; i < b.length(); i++) {
if (permPresent(a, b.substring(i))) {
sum++;
}
}
return sum;
}
// is a permutation of a present at the start of b?
public static boolean permPresent(final String a, final String b) {
if (a.isEmpty()) {
return true;
}
if (b.isEmpty()) {
return false;
}
final char first = b.charAt(0);
if (a.contains(b.substring(0, 1))) {
// super ugly, but removes first from a
return permPresent(a.substring(0, a.indexOf(first)) + a.substring(a.indexOf(first)+1, a.length()),
b.substring(1));
}
return false;
}
}
答案 3 :(得分:0)
在laravel中,你可以做的是在文件 conf / database 的连接数组中创建不同的连接,然后在你要在应用程序中执行操作时可以使用它们。
如果您使用查询构建器或原始展示,则必须使用连接('name')方法执行查询,例如:
$users = DB::connection('mysql')
->table('users')
->select(...)
->get();
如果使用eloquent,您可以在连接属性中指定模型文件中的连接名称,例如:
<?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
答案 4 :(得分:0)
我认为更改数据库连接位置的好地方是bootstrap/app.php
文件,请使用以下代码:
$app->afterBootstrapping(\Illuminate\Foundation\Bootstrap\LoadConfiguration::class, function ($ap) {
// your database connection change may happens here
});
这是在ServiceProvider注册和引导之前进行的,因此,即使您在ServiceProvider中使用DB
或Eloquent
人员,也可以很好地工作。
答案 5 :(得分:0)
广泛搜索后,我发现这种情况:
转到此文件 vendor \ laravel \ framework \ src \ Illuminate \ Auth \ Middleware \ Authenticate.php
转到方法:受保护的函数authenticate($ request,数组$ 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名称或类似的列表。因此,在下一个条件下,我要确保db_name可用:
&& !empty( auth()->user()->db_name )
然后在执行后进入if条件,我从用户记录中获取db_name并根据用户数据库设置配置,保存配置并使用DB类的清除方法保留此设置。 我真的很坚持。我不想在每个类中更改数据库连接。这就是我的方法。现在,我可以在没有任何紧张的情况下使用Eloquent和DB。在我的应用程序中,我有一个中心数据库供所有用户登录,然后对于每个组织都有一个不同的数据库。因此,在用户登录后,不需要中心数据库(登录数据库),而是需要用户/组织特定的数据库。所以这就是我如何使其工作。