2016-05-12 122 views
0

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

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

由于很多原因,组织数据源不适合我的模型:表名不一致,模式不同,我的实体的字段在分隔表中,也许他们有不同数据库中的信息或不同的DBMS中的信息!

我想知道如果有一种方法,使实现这一 enter image description here

在这样一种方式,CakePHP的型号/实体可以使用数据,而不管源的接口。你有什么建议如何做到这一点? CakePHP有一个选项可以使这成为可能吗?我应该使用诸如JSON或XML之类的标记语言来使用PHP吗?也许MySQL有一个实用程序将不同来源的数据转换为视图,并且我可以让CakePHP使用视图而不是表格? 如果你有一个答案尽可能详细,你可以。

如果不可能制作接口,则可以使用其他选项: - Usw另一个可以处理这个问题的框架,它具有上面提到的功能。 - 让组织改变他们的数据库,以便它符合我的模型(我不喜欢这个模型,可能他们不会这样做)。 - 在应用程序自己的数据库中传输数据。

附加信息: 图形中显示的数据来自大学的学生。任何一所大学都有自己的数据库,并使用数据库自​​己的结构和应用程序,这就是为什么改变结构并不那么容易。我只是想尽可能简单地让任何学校配置他们自己的数据库。编辑: 版本是CakePHP 3.2。 一个重要的约会是它不需要所有的CRUD操作,只需要“阅读”。希望能让解决方案变得更容易。

+0

请把这里https://github.com/waldemarnt/cake-multi-tenant看看使用CakePHP的2.x的,但我认为构建这可以帮助你:) –

+1

请提及你正在使用的确切的CakePHP版本(模型/数据源层已经通过CakePHP 3发生了巨大变化),并且可以很好地标记你的问题 - 谢谢! – ndm

+0

@ndm我加了信息,谢谢你:) –

回答

1

我不认为你的“问题”能被正确回答,它没有足够的信息,没有足够的细节。我想有东西,将保持所有组织相同,但他们的数据和业务逻辑将有所不同。但我会尝试。

由于很多原因,组织数据源无法适合我的模型:表名不一致,模式不同,我的实体的字段在分隔表中,可能它们有不同数据库中的信息或不同的DBMS中的信息!

模型是一个整层,所以如果你有完全不同表架构你的业务逻辑,这就是层的一部分,将是不同的。仅仅简单地改变数据库连接并不会对你有所帮助。数据需要在视图中显示,视图也必须不同。

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

和一个技术性的东西:你可以在模型层define the connection of a table object。任何实体都知道它的来源,但不应该在实体内实现业务逻辑,也不应通过实体更改连接。

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

如果这是真的要么使用the CRUD plugin(是的,你可以只使用它的R部),或写一些代码,这样描述了组织,将被用来建立在你的表对象和视图类飞。

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

1

我找到了一种不编码任何接口的方法。实际上,它使用了已经包含在DBMS和CakePHP中的一些功能。

如果模式不适合模型,可以创建视图以匹配模型中的表名和列名。根据定义,视图以表格的形式工作,因此CakePHP搜索相同的表名称和列,并使用DBMS进行工作。 我在MySQL中对视图进行了测试,它工作正常。您还可以合并来自不同表格的数据。

MySQL views

SQL Server views

如果用户使用另一个DBMS你只需要改变的datasource在app.php,并作出意见,如果有必要

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

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

使用: CakePHP的3.2 SQL SERVER 2016 MySQL5.7