我正在创建一个依赖于来自 REST API 的第三方数据的应用程序,并将其与我自己的数据库中的数据相结合。
我在 API 上有一个location
实体端点,我需要使用 API 定义的过滤器(查询参数)进行查询,并使用 Doctrine 从我的数据库中获取给定location
的events
列表。
我遇到的问题是,如果我请求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 数据缓存在本地数据库中,但这会增加其他复杂性,尤其是与确保缓存与源数据保持最新相关的复杂情况。想象一下,试图使谷歌地图数据的缓存保持最新......