包含Silversstripe中外部数据库数据的网格字段


Gridfield containing data from external database in Silverstripe

我使用ModelAdmin通过网格字段显示数据。我想以同样的方式管理模型,但要从外部数据库管理。

在我的模型管理员中,我有代码来调用我想要管理的模型(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并定义了一些字段。

通过这种方式,网格字段在我的modelAdmin中显示了这个模型的结果,所以它可以工作,但我如何才能在这个网格字段中显示我的第二个数据库的结果。有可能吗?

这是一个有趣的场景,在SilverStripe的默认设置中是不可能开箱即用的。请注意,在任何时候,都只有一个DB连接打开,就像大多数CMS系统一样,ORM在您的模型中使用的就是这个连接。

然而,我原则上不明白为什么这不能在SilverStripe中完成,但在你的模型令人满意地工作之前,还需要在模型后面写一些额外的类。任何解决方案也将取决于您想要在每个相应的数据库上编辑、删除模型(所有标准的GridField操作)。

我想到的唯一解决方案是使用SilverStripe的内置Aspects系统,但我不得不承认我自己从未使用过它。面向方面编程不同于作为OO类编程的标准业务逻辑,但仍然可以在OO范式中使用。它允许开发人员"点切割"(在预定义的场景下,在不同的类中"水平"切割类逻辑并使用不同的逻辑)。

把它想象成一个钩子。

查看SilverStripe的方面系统及其使用的示例(请参阅:https://docs.silverstripe.org/en/3.2/developer_guides/extending/aspects/),我相信你可以修改这个例子。该示例解释了ORM如何根据DB读取或写入来使用一个DB连接而不是另一个,这听起来与您的场景类似,希望不是"读取"answers"写入"是使用哪个连接的仲裁者,而是使用哪个模型-也许是通过实现特定接口。

祝你好运:-)