我正在创建一个应用程序,该应用程序依赖于REST API中的第三方数据,并将其与我自己的数据库中的数据相结合。
我在API上有一个location
实体端点,我需要使用API定义的过滤器(查询参数)进行查询,并在给定的events
处获取location
的列表从我的数据库使用教义。
我遇到的问题是,如果我请求一个event
并尝试获取其location
,我将不得不向每个第三方event
发出一个请求。
我确定不是第一个需要组合不同数据源的人,但是我并没有在网上找到很多有关它的信息。
我可以将第三方数据缓存到数据库中,这可能会使我像往常一样简单地使用Doctrine?
还是如果Doctrine允许的话,我应该创建一个不存在于数据库中的理论存储库吗?
我觉得这些都不是理想的方法。我调查了尚未尝试使用的DoctrineRestDriver,但是(尚未)看不到如何为单个数据模型(location
)定义其他驱动程序,以及是否进行了管理那我该如何注释关系?
感谢您的输入!
答案 0 :(得分:0)
出于完全相同的原因,我也试图弄清楚这一点。据我所知,没有一种简单的方法可以在由不同的(Doctrine)实体管理器管理的实体之间建立简单的关系。
https://github.com/doctrine/orm/issues/5769
Using Relationships with Multiple Entity Managers
您可以将实体管理器/注册注入“事件”实体,并使用其使用location_id字段获取相关的“位置”实体。尽管可能,但是当您使实体依赖实体管理器时,它可能不是最干净的。
https://matthiasnoback.nl/2014/05/inject-a-repository-instead-of-an-entity-manager/
更好的解决方案可能是设置一个服务,然后将其注入“事件”实体中。然后,您可以使用该服务来获取位置。
Using EntityManager inside Doctrine 2.0 entities
使用DoctrineRestDriver,您可以像其他实体一样连接位置实体,并且应该能够基于事件中的location_id(通过API)查询位置。您可以轻松地在事件实体中使用该逻辑来注册服务。
尽管服务可以解决从事件获取位置的问题,但它无法为您提供一种运行将事件和位置连接在一起的查询的方法。在事件查询中,您将只能使用location_id。
我不确定如果您循环访问10个事件(都位于同一位置),将发生什么情况。它会进行10次API调用来获得相同的位置吗?可以通过缓存来解决以减少开销吗?
或者,您可以设置一个单独的过程,该过程将API数据缓存在本地数据库中,但是会增加其他复杂性,特别是与确保缓存与源数据保持最新有关。想象一下,尝试使Google Maps数据的缓存保持最新状态...