在教义中结合来自多个来源的数据



我正在创建一个依赖于来自 REST API 的第三方数据的应用程序,并将其与我自己的数据库中的数据相结合。

我在 API 上有一个location实体端点,我需要使用 API 定义的过滤器(查询参数)进行查询,并使用 Doctrine 从我的数据库中获取给定locationevents列表。

我遇到的问题是,如果我请求event并尝试获取其location,我将不得不为每个event向第三方发出请求。

我确定不是第一个需要组合不同数据源的人,但我在网上没有找到太多关于它的信息。

我可以缓存第三方数据,也许可以缓存到数据库中,这将允许我像往常一样简单地使用 Doctrine?

或者,如果教义允许,我应该创建一个不保留在数据库中的教义存储库?

我觉得这两种方法都不是理想的方法。我研究了我还没有尝试使用的 DoctrineRestDriver,但我(还)不知道我将如何为单个数据模型定义不同的驱动程序 (location),如果我确实管理了它,我将如何注释关系?

感谢您的任何输入!

出于完全相同的原因,我也在尝试解决这个问题。从我所读到的内容来看,没有简单的方法可以在由不同(教义)实体经理管理的实体之间建立简单的关系。

https://github.com/doctrine/orm/issues/5769

使用与多个实体经理的关系

您可以将实体管理器/注册注入"事件"实体,并使用它来通过location_id字段获取相关的"位置"实体。尽管可能,但它可能不是最干净的,因为您使实体依赖于实体管理器。

https://matthiasnoback.nl/2014/05/inject-a-repository-instead-of-an-entity-manager/

更好的解决方案可能是设置一个注入到"事件"实体中的服务。然后,使用该服务获取位置。

在 Doctrine 2.0 实体中使用 EntityManager

使用 DoctrineRestDriver,您可以像连接任何其他实体一样连接位置实体,并且您应该能够根据事件中的location_id查询位置(从 API)。该逻辑可以轻松地放入可在事件实体中使用的已注册服务中。

尽管服务可以解决从事件中获取位置的问题,但它不提供运行加入事件和位置的查询的方法。在事件查询中,您将仅限于location_id。

我不确定如果您循环浏览 10 个事件的集合,所有事件都具有相同的位置,会发生什么。它会进行 10 次 API 调用以获得相同的位置吗?这可以通过缓存来解决以减少开销吗?

或者,您可以设置一个单独的进程,将 API 数据缓存在本地数据库中,但这会增加其他复杂性,尤其是与确保缓存与源数据保持最新相关的复杂情况。想象一下,试图使谷歌地图数据的缓存保持最新......

相关内容

  • 没有找到相关文章

最新更新