【问题标题】:Yii2: How to let ActiveRecord models only see certain database data?Yii2:如何让 ActiveRecord 模型只看到某些数据库数据?
【发布时间】:2015-07-15 15:31:42
【问题描述】:

我正在尝试实现一个多租户应用程序。我有不同的客户使用相同的代码。但是每个客户都有自己的入口脚本和自己的配置。客户 ID 可通过 Yii::$app->params['customerId'] 访问。注意:我必须以这种方式区分客户,因为没有登录/身份验证。无论如何,假设调用了控制器操作并使用参数给出了客户 ID。

现在我有一些表格,每个表格都有一个客户 ID 列。我已经用 gii 创建了模型类,一切都很好。但是现在我遇到了一个问题,我必须检查或告诉每个数据库操作必须使用哪个客户 ID。因此,在每个数据库操作(查询)中,我都可以添加一个->andWhere(['customerId' => Yii::$app->params['customerId']])。当然,这是乏味且容易出错的。

有没有办法简化这个?考虑有查找、插入、更新、删除和连接操作。我可能可以使用Customized query classes,但我不知道我必须在那里做什么,我不确定它是否有助于插入/更新/删除。还要考虑存在具有相同客户 ID 列的相关表。 hasMany()hasOne() 也应该反映这一点。

我的目标是让客户 ID 尽可能透明。我不想去想它。所以我可以想象某种抽象查询类,它使用某个列(客户 ID 列)进行所有操作,并以某种方式获取客户 ID(注入或使用Yii::$app->params['customerId'])。

我的假设是我需要主要在模型中执行此操作。我认为控制器不太关心这个话题。

有什么建议吗?

【问题讨论】:

    标签: activerecord model yii2 multi-tenant


    【解决方案1】:

    在您描述的表单解决方案的情况下,它是使用能够过滤客户 ID 数据的数据库视图来管理数据。这涉及对您可以通过更改模型的函数 tableName () 来管理的表/视图的动态访问。创建视图也可以使用 DML 数据库功能自动化。这只是一个简单的介绍,希望对你有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-29
      • 1970-01-01
      • 2012-10-09
      • 2016-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多