Laravel修改了雄辩的到租户数据库的可变连接


Laravel modify eloquent to have a variable connection to tenant database

这是类似的情况:

Laravel Eloquent ORM 中的多租户

我想修改雄辩模型,使其具有可变的数据库连接名称。我有一个字符串形式的名称。我将有数百个模型连接到租户数据库,所以我想要一个单行。。。

我尝试过几种方法。有效的方法是:

$posUser = new posUser();
$posUser->setConnection($this->system->getDBC());
$posUser->create($posUserData);

类设置如下:

class posUser extends myModel
{
}
class myModel extends Model
{
    public function setConnection($dbc)
    {
        $this->connection = $dbc;
    }
}

不过这有点冗长。我想要的是一句话:

posUser::create($posUserData);

我确实通过创建一个新的数据库连接并将该连接设置为默认连接来实现这一点,当注册用户访问该网站时就会发生这种情况。我会对这样的命令感到更舒服(哪个错误…)

posUser::On($connection_name)->create($posUserData);

并要求所有使用租户数据库的模型指定连接。我只是害怕一个租户会以某种方式写入另一个租户数据库。有什么想法吗?

到目前为止,我的答案是将连接设置为默认连接,然后正常操作。

1) 使用"主"连接从数据库获取系统连接信息2) 创建租户连接3) 将其设置为默认

然后,您将不提供连接到的所有租户模型/查询。我的主连接设置为"main"。

Tenant Connection class
class TenantDatabaseConnector
{
    public static function GetDBCPrefix()
    {
        return strtolower(env('DB_PREFIX')) .'_'.env('MAIN_DB_NAME') . '_';
    }
    public static function createTenantConnection(System $system)
    {
        if(! self::checkDB($system->dbc()))
        {
            dd('You sure there is a database named ' . $system->dbc());
        }
        $env = strtoupper(env('DB_PREFIX'));
        $connections = Config::get('database.connections');
        $tenant_connection = [
            'driver'    => 'mysql',
            'host'      => env($env . '_DB_HOST'),
            'database'  => $system->dbc(),
            'username'  => env($env. '_DB_USERNAME'),
            'password'  => env($env .'_DB_PASSWORD'),
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
            'strict'    => false,
            'port' => '3306'
        ];
        $connections[$system->dbc()] = $tenant_connection;
        Config::set('database.connections', $connections);
        self::setDefaultDBC($system);
        return true;
    }
    public static function setDefaultDBC($system)
    {
        Config::set('database.default', $system->dbc());
    }
    public static function checkDB($dbc)
    {
        $sql = "SELECT SCHEMA_NAME FROM 
                INFORMATION_SCHEMA.SCHEMATA 
                WHERE SCHEMA_NAME = '". $dbc ."'";
        $dbexists = DB::connection('main')->select($sql);
        if(sizeof($dbexists) > 0)
        {
            return true;
        }
        return false;
    }
}

您可以看到一个$env变量,我正在使用它为数据库设置local_、alpha_、beta_和testing_前缀。