Я работаю над приложением с несколькими арендаторами и работаю над регистрацией арендаторов прямо сейчас. Поэтому я пытаюсь зарегистрировать арендаторов прямо сейчас. В процессе регистрации арендатора в основной БД создается новая запись, также создается новая БД для арендатора.
Теперь я хочу перенести новую арендаторскую БД с переносом арендатора, но, к сожалению, я не знаю, как динамически изменить соединение с БД, перенести все таблицы и настроить для него учетную запись администратора.
<?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,
],
],
Вы можете динамически обращаться к нескольким соединениям в файле конфигурации базы данных Laravels.
Вот отличная статья, которая показывает, как это сделать.
Других решений пока нет …