【问题标题】:Managing multiple datasources in CakePHP在 CakePHP 中管理多个数据源
【发布时间】:2016-05-12 17:21:21
【问题描述】:

我打算用 CakePHP 开发一个 Web 应用程序,以图形和卡片的形式显示信息。卡片。我选择 CakePHP 是因为我们需要展示的信息非常结构化,所以模型的方法更容易管理数据;我也有一些来自 ASP.NET 的 MVC 经验,我喜欢使用路由是多么简单。

所以,我的问题是,可以使用该应用程序的多个组织将拥有自己的数据库,其架构与我们需要的架构不同。我不能只在 app.php 文件中设置他们的字符串连接,因为他们的数据库与我的模型不匹配。

由于很多原因,组织数据源不适合我的模型:表的名称不同,架构不同,我的实体的字段在单独的表中,也许他们的信息在不同的数据库或不同的 DBMS!

我想知道是否有办法制作实现此目的的界面

以这样一种方式,cakephp 模型/实体可以使用数据,而不管来源如何。你对如何做到这一点有什么建议吗? CakePHP 是否可以选择使这成为可能?我应该将 PHP 与某种标记语言(如 JSON 或 XML)一起使用吗?也许 MySQL 有一个实用程序可以将来自不同来源的数据转换为视图,我可以让 CakePHP 使用视图而不是表? 如果您有答案,请尽可能详细。

如果无法制作界面,则可以使用其他选项: - 使用另一个框架可以更轻松地处理此问题并具有我上面提到的功能。 - 让组织更改他们的数据库,使其与我的模型相匹配(我不喜欢这个,他们可能不会这样做)。 - 在应用程序自己的数据库中传输数据。

附加信息: 图表中显示的数据来自大学学生。任何大学都有自己的数据库,有自己的结构和使用数据库的应用程序,这就是为什么改变结构不是那么容易的原因。我只是想让任何学校尽可能轻松地配置自己的数据库。

编辑: 版本是 CakePHP 3.2。 一个重要的约定是它不需要所有的 CRUD 操作,只需要“读取”。希望这使解决方案更容易。

【问题讨论】:

  • 请看这里 github.com/waldemarnt/cake-multi-tenant 是使用 CakePHP 2.x 构建的,但我认为这可以帮助你:)
  • 请始终提及您正在使用的确切 CakePHP 版本(模型/数据源层在 CakePHP 3 中发生了巨大变化),并相应地标记您的问题 - 谢谢!
  • @ndm 我添加了信息,谢谢你:)

标签: cakephp datasource cakephp-3.0 multi-tenant cakephp-3.2


【解决方案1】:

我认为您的“问题”无法正确回答,它没有包含足够的信息,没有足够的细节。我猜有些东西对于所有组织都将保持不变,但它们的数据和业务逻辑会有所不同。不过我会试试看的。

由于很多原因,组织数据源不适合我的模型:表的名称不同,架构不同,我的实体的字段在单独的表中,也许他们的信息在不同的数据库或不同的 DBMS!

模型是一个完整的层,因此如果您有完全不同的表模式,那么作为该层一部分的业务逻辑也会有所不同。仅仅改变数据库连接对你没有帮助。数据也需要显示在视图中,并且视图也必须不同。

因此,您可以尝试做的以及您的第二张图片显示的是,您实现了一个包含接口和基类的层。然后为使用这些接口和基类的每个组织创建一个 Cake 插件,并编写一些代码,根据检查的任何标准(猜测域或子域)有条件地使用该插件。您必须以一种可以在 API 级别访问任何组织的方式来定义中间接口。

还有一件事:你可以在模型层define the connection of a table object。任何实体都知道它的来源,但您不应在实体内部实现业务逻辑,也不应通过实体更改连接。

编辑:版本是 CakePHP 3.2。一个重要的约定是它不需要所有的 CRUD 操作,只需要“读取”。希望这使解决方案更容易。

如果是这样,请使用the CRUD plugin(是的,您只能使用其中的 R 部分)或编写一些代码,例如描述组织的类,并将用于动态创建表对象和视图.

总的来说,这是一个非常有趣的问题,但恕我直言,可以在这里给出一个简单的答案或解决方案。我认为这需要一些讨论和分析才能找到最佳解决方案。如果您有兴趣咨询,可以联系我,查看我的个人资料。

【讨论】:

    【解决方案2】:

    我找到了一种无需编写任何接口的方法。事实上,它使用了一些已经包含在 DBMS 和 CakePHP 中的特性。

    如果架构不适合模型,您可以创建视图以匹配模型中的表名和列名。根据定义,视图作为表工作,因此 CakePHP 搜索相同的表名和列,然后由 DBMS 完成工作。 我在 MySQL 中使用视图进行了测试,效果很好。您还可以合并来自不同表的数据。

    MySQL views

    SQL Server views

    如果用户使用其他 DBMS,您只需更改 app.php 中的 datasource,并在必要时创建视图

    如果数据分布在不同的 DBMS 中,CakePHP 让你设置一个datasource for each table,你只需将它添加到 app.php 并在需要时在表中调用它。

    最后,如果您只需要“阅读”选项,请创建一个对视图具有有限访问权限且仅具有 SELECT 权限的用户。

    使用: CakePHP 3.2 SQL 服务器 2016 MySQL5.7

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      • 1970-01-01
      • 1970-01-01
      • 2016-09-25
      • 1970-01-01
      • 2014-05-27
      相关资源
      最近更新 更多