2016-01-04 4 views
0

Это аналогичная ситуация:Laravel изменить красноречив, чтобы иметь переменное подключение к базе данных арендатора

Multi tenancy in 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); 

И требуют, чтобы все модели с использованием баз данных арендатора, чтобы указать соединение. Я просто напуган, что один арендатор каким-то образом напишет в другую базу данных арендатора. Есть идеи?

ответ

0

Ответ для меня до сих пор заключается в том, чтобы установить соединение по умолчанию, а затем работать как обычно.

1) получить информацию о подключении системы из базы данных с помощью «главного» соединение 2) создать соединение арендатора 3) установить его по умолчанию

Тогда все модели арендатора/запросы вы не подводимой к подключение к. Основное соединение для меня установлено как «основное».

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_ префиксы к моим базам данных.

+0

https://lukevers.com/2015/03/25/on-the-fly-database-connections-with-laravel-5 – sumit

Смежные вопросы