[PROMOÇÃO] Assine com + 30% de desconto ANUAL MENSAL (últimas horas)
Miqueias
Criador Miqueias 08/09/2021

Boa tarde Professor! 

Estou fazendo o curso de Multi Tenancy Multi Database onde você ensina o método por domínios.

 

No meu caso, não cadastrarei as empresas manualmente, elas farão isso no momento de registro na plataforma.

Ao se registrar, crio o banco de dados e uma coluna na tabela "users" com um código único de identificação de 10 dígitos.

 

Já consegui fazer a criação de banco de dados e tabelas automaticamente no momento do registro.

 

Porém não consego ver como conectar o usuário ao banco de dados usando o código de 10 dígitos gerado (que seria o domínio nesse caso).

 

Não consigo criar o Middleware Tenant com essa lógica, pode me ajudar?

Manager Carlos Ferreira 08/09/2021

Olá, Miqueias!
Tudo bem?

Você pode usar esse código único por empresa para alternar o banco.

Mas, a pergunta é como saber se o usuário que está acessando é da empresa x ou empresa y?
Uma das formas é através do domínio ou subdomínio (igual no curso).

Outra maneira possível é ter no formulário de login um combobox com todas as empresas que você tem cadastrado, aí esse usuário indica qual empresa ele vai se conectar.

Pegou a ideia amigo?

Carlos Ferreira
Criador Miqueias 08/09/2021

No caso a empresa é atrelada ao usuário.

Consegui recuperar o valor da tabela "code" no middleware com o seguinte código:

Fiz a verificação se o usuário está logado, ao invés de verificar o URL, já que o URL do dashboard é o mesmo para todos.

 

Segue meu middleware e ManagerTenant: (o que acha desse modelo?)

MIDDLEWARE:
 
public function handle(Request $request, Closure $next)
    {

        if (!auth()->check()) {
            redirect()->route('login');
        } else {
            $user_code = Auth::user()->code;
            $tenant = $this->getTenant($user_code);
            app(ManagerTenant::class)->setConnection($tenant);
        }

        return $next($request);
    }

    public function getTenant($code)
    {
        return User::where('code', $code)->first();
    }
 
MANAGER TENANT:
 
    public function setConnection(User $user)
    {
        $db_name = "delivery_" . $user->code;
        DB::purge('tenant');
        config()->set('database.connections.tenant.database', $db_name);
        config()->set('database.connections.tenant.host''127.0.0.1');
        config()->set('database.connections.tenant.username''root');
        config()->set('database.connections.tenant.password''');

        DB::reconnect('tenant');

        Schema::connection('tenant')->getConnection()->reconnect();
    }
 
Miqueias
Manager Carlos Ferreira 08/09/2021

A relação entre users x empresa é 1:1?

Mas, por que isso?
$tenant = $this->getTenant($user_code);

Na tabela users não tem uma coluna com o valor do tenant? tenant_id

Porque ficou redundate essa consulta do User.

Tipo, aqui você tem um objeto de user:
$user_code = Auth::user()->code;

Aqui você busca o mesmo user pelo user já no objeto:
// getTenant
return User::where('code', $code)->first();

Carlos Ferreira
Sabe a Solução? Ajude a resolver!

Precisa estar logado para conseguir responder a este ticket!

Clique Aqui Para Entrar!