Как динамически изменить соединение с БД в Laravel?

Я работаю над приложением с несколькими арендаторами и работаю над регистрацией арендаторов прямо сейчас. Поэтому я пытаюсь зарегистрировать арендаторов прямо сейчас. В процессе регистрации арендатора в основной БД создается новая запись, также создается новая БД для арендатора.

Теперь я хочу перенести новую арендаторскую БД с переносом арендатора, но, к сожалению, я не знаю, как динамически изменить соединение с БД, перенести все таблицы и настроить для него учетную запись администратора.

<?php

namespace App\Http\Controllers\Auth;

use App\Tenant;
use Validator;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\ThrottlesLogins;
use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers;

use Illuminate\Http\Request;

class AuthController extends Controller
{
/*
|--------------------------------------------------------------------------
| Registration & Login Controller
|--------------------------------------------------------------------------
|
| This controller handles the registration of new users, as well as the
| authentication of existing users. By default, this controller uses
| a simple trait to add these behaviors. Why don't you explore it?
|
*/

use AuthenticatesAndRegistersUsers, ThrottlesLogins;

/**
* Create a new authentication controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest', ['except' => 'getLogout']);
}

protected $redirectTo = '/auth/login';

/**
* Get a validator for an incoming registration request.
*
* @param  array  $data
* @return \Illuminate\Contracts\Validation\Validator
*/
protected function validator(array $data)
{
return Validator::make($data, [
'name' => 'required|max:255',
'username' => 'required|max:255|unique:tenants',
'email' => 'required|email|max:255',
'password' => 'required|confirmed|min:6',
]);
}

/**
* Create a new user instance after a valid registration.
*
* @param  array  $data
* @return User
*/
protected function createTenant(array $data)
{
return Tenant::create([
'name' => $data['name'],
'username' => $data['username'],
]);
}

protected function createDbForNewTenant($username)
{
\DB::statement('CREATE DATABASE ' . $username);
}

public function getRegister()
{
return view('auth.register');
}

public function getLogin()
{
return view('auth.login');
}

public function postRegister(Request $request)
{
$validator = $this->validator($request->all());

if ($validator->fails()) {
$this->throwValidationException(
$request, $validator
);
}

$this->createTenant($request->all());
$this->createDbForNewTenant($request->username);

\Config::set('database.connections.archive.database', $request->username);

\Artisan::call('migrate', [
'--path' => 'database/migrations/archive'
]);

return redirect($this->redirectPath());
}
}

Так что, если вы посмотрите на postRegister, я могу выполнить проверку в порядке, я могу создать новую запись и создать базу данных тоже. Но теперь мне нужно изменить соединение с этой БД и запустить команду миграции. Я использую Config установить ключ базы данных, но я до сих пор не вижу запущенных миграций.

Что я делаю неправильно?

РЕДАКТИРОВАТЬ

'connections' => [

'archive' => [
'driver'    => 'mysql',
'host'      => env('DB_HOST', 'localhost'),
'database'  => env('DB_DATABASE', 'forge'),
'username'  => env('DB_USERNAME', 'forge'),
'password'  => env('DB_PASSWORD', ''),
'charset'   => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix'    => '',
'strict'    => false,
],

'tenant' => [
'driver'    => 'mysql',
'host'      => env('DB_HOST', 'localhost'),
'database'  => env('DB_DATABASE', 'forge'),
'username'  => env('DB_USERNAME', 'forge'),
'password'  => env('DB_PASSWORD', ''),
'charset'   => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix'    => '',
'strict'    => false,
],

],

1

Решение

Вы можете динамически обращаться к нескольким соединениям в файле конфигурации базы данных Laravels.

Вот отличная статья, которая показывает, как это сделать.

http://fideloper.com/laravel-multiple-database-connections

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]