Yii2: ¿Cómo dejar que los modelos ActiveRecord solo vean ciertos datos de la base de datos?
multi-tenant (1)
Estoy tratando de implementar una aplicación multi-tenant. Tengo diferentes clientes que usan el mismo código. Pero cada cliente obtiene su propio script de entrada con su propia configuración. La identificación del cliente es accesible por Yii::$app->params[''customerId'']
. Nota: Tengo que distinguir a los clientes de esa manera porque no hay inicio de sesión / autenticación. De todos modos, suponga que se llama a la acción del controlador y se proporciona una identificación del cliente con el parámetro.
Ahora tengo algunas tablas y cada una tiene una columna para la identificación del cliente. He creado clases modelo con gii y todo está bien. Pero ahora tengo el problema que tengo que verificar o decir para cada operación de base de datos que se debe usar con la identificación del cliente. Entonces, en cada operación de DB (Query) puedo agregar un ->andWhere([''customerId'' => Yii::$app->params[''customerId'']])
. Esto es tedioso y propenso a errores, por supuesto.
¿Hay alguna forma de simplificar esto? Considere que hay operaciones de búsqueda, inserción, actualización, eliminación y unión. Probablemente pueda usar clases de consulta personalizadas, pero no sé qué tengo que hacer allí y no estoy seguro si esto ayuda con las inserciones / actualizaciones / eliminaciones. Considere también que hay tablas relacionadas con la misma columna de id del cliente. hasMany()
y hasOne()
también deberían reflejar esto.
Mi objetivo es que la identificación del cliente sea lo más transparente posible. No quiero pensar en eso. Así que podría imaginar algún tipo de clase de consulta abstracta que utiliza una determinada columna (la columna de identificación del cliente) para todas las operaciones y que obtiene la identificación del cliente de alguna manera (inyectado o con Yii::$app->params[''customerId'']
).
Mi suposición es que necesito hacer esto principalmente en el modelo. Creo que los controladores están menos preocupados por este tema.
¿Alguna sugerencia de cómo hacer eso?
En situaciones como las que describió como una solución de formulario, es para administrar datos con vistas de bases de datos que pueden filtrar los datos para la identificación del cliente. Esto implica el acceso dinámico a las tablas / vistas que puede administrar cambiando la función tableName () del modelo. La creación de vistas también se puede automatizar con las funciones de la base de datos DML. Esta es solo una breve introducción, espero que esto sea útil para ti.