我正在使用ModelAdmin通过gridfield显示数据。我想以相同的方式管理模型,但是来自外部数据库。
在我的模型管理员中,我有代码来调用我想管理的模型(DataObject):
private static $managed_models = array(
'exampleModel'
);
要将数据插入第二个数据库,我在函数中有以下代码:
global $databaseConfig, $databaseConfig2;
DB::connect($databaseConfig2); //connect to second database
//do somee stuff
DB::connect($databaseConfig); //return to default database
仅供测试,我使用了dataObject exampleModel并定义了一些字段。
通过这种方式,gridfield在我的modelAdmin中显示了这个模型的结果,所以它正在工作,但是如何在这个gridfield中显示我的第二个数据库的结果。有可能吗?
答案 0 :(得分:1)
这是一个有趣的场景,在SilverStripe的默认设置中不可能开箱即用。请注意,在任何时候,只有一个数据库连接打开,就像大多数CMS系统一样,这是ORM在模型中使用的连接。
但是,我原则上不明白为什么在SilverStripe中无法做到这一点,但是还需要编写一些额外的类"""你的模型才能令你满意的工作。任何解决方案也都取决于您希望在每个相应数据库中编辑,删除模型(所有标准GridField操作)。
想到的唯一解决方案是使用SilverStripe的内置Aspects系统 - 但我不得不承认自己从未使用过它。面向方面编程与标准业务逻辑一样的OO编程不同,但仍可在OO范例内使用。它允许开发人员切入"切入" (切换"水平"跨越类逻辑并利用不同的逻辑,在预定义的场景下的不同类中)。
把它想象成一个钩子。
查看SilverStripe的方面系统及其使用的示例(请参阅:https://docs.silverstripe.org/en/3.2/developer_guides/extending/aspects/),我相信可以根据您的需要修改示例。该示例解释了如何基于数据库读取或写入,ORM应该使用一个数据库连接而不是另一个数据库连接,这听起来与您的方案类似,期望不是"读取"和"写"作为使用哪种连接的仲裁者,它将是哪种模型 - 可能是通过实现特定的接口。
祝你好运: - )