Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Administar multiples bd

26 de mayo de 2016

Estimados.

Esta es mi situación. Hay una aplicación que administra el area RRHH de varias empresa, para ello el sistema crea un BD (mismo esquema) por cada empresa.

Estas BD estan en el mismo servidor, con los mismos datos acceso. Las consultas (Doctrine) y procesamiento posterior es el mismo para cada registro de las a bd. Mi duda como puedo hacer que cada vez que se llame a esto:

$em = $this->getDoctrine()->getManager('según usuario');

Nombre de la bd que necesito.

Gracias.


Respuestas

#1

Este problema es bastante difícil de resolver porque Doctrine no soporta pro defecto el "multi-tenancy" (que es como se llama esta funcionalidad). Aún así, es posible conseguirlo con algo de código en tu aplicación. En este artículo te muestran un ejemplo de cómo hacerlo.

@javiereguiluz

27 mayo 2016, 8:26
#2

Hola,

Me encuentro en una situación similar, un sistema SaaS en el que cada cliente tiene su esquema, cuando logueo al usuario con su código de cliente lo almaceno en el usuario y siempre tengo acceso a ese código de cliente que a su vez es el nombre de su conexión, por tanto haciendo un $this->getDoctrine()->getManager('codigo'); tengo acceso a su BBDD. Pero claro, si hago una petición a /users/3/edit, el ParamConverter utiliza el esquema por defecto que uno "global", o al usar un campo de tipo Entity en un formulario tengo que indicarle que manager utilizar.

¿Existe la posibilidad tener un EntityManager personalizado que haga esa comprobación en función del usuario logueado?. He leído algo de los decoradores para hacer lo que quiero, pero no me ha quedado muy claro. Estoy empezando actualmente con el proyecto y si no es posible lo que quiero tendré que replantearme el como hacerlo.

Gracias.

Un saludo.

@LoGaNsF

27 mayo 2016, 15:29
#3

@javiereguiluz

Estaba viendo el articulo y tengo unas dudas.

$params = $refParams->getValue($connection);
$params['dbname'] = $dbName;
$params['user'] = $dbUser;
$params['password'] = $dbPassword;
$params['host'] = $dbHost;
 
$refParams->setAccessible('private');
$refParams->setValue($connection, $params);

Aqui extrae los datos de conexión "child", yo podria

$params['dbname'] = $dbName;

Cambiar solo algunos datos como bd de datos.

y cada ves que llame al entitymananger dentro de una Action tendria que ejecutar esto.

$connector = $this->container->get('application_connector');
$connector->resetConnection($dbName, $dbUser, $dbPassword, $dbHost, $reset = true);
 
//childEM is now connected to the new database.
$childEm = $this->getDoctrine()->getManager('child');

@dariongg

27 mayo 2016, 17:25