Laravel修改eloquent以获得与租户数据库

时间:2016-01-04 17:36:31

标签: php laravel

这是类似的情况:

Multi tenancy in Laravel Eloquent ORM

我想修改eloquent模型以获得可变数据库连接名称。我有一个字符串名称。我将有数百个模型连接到租户数据库,所以我想要一个单行...

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

$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 个答案:

答案 0 :(得分:0)

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

1)使用" main"从数据库获取系统连接信息。连接 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;
    }

}

你看到我用来为我的数据库设置local_,alpha_,beta_,testing_前缀的$ env变量。