处理教义存储库中的未映射属性

时间:2018-07-24 09:39:30

标签: php symfony events doctrine

我有一个实体BlogPost,其中有一个字段status。此状态取决于外部API的某些数据。为了解决这个问题,我实现了一个postLoad侦听器,该侦听器会在实体加载后设置状态。

现在的问题是,我想按此状态进行过滤。

在我的存储库中,我通常会编写一种类似于getBlogPostByStatusXY()的方法。

但这现在不起作用,因为这些数据没有保存为我的数据库中的不动产...

有人有一个聪明的主意如何应对吗?

如果我无法避免将状态保存到数据库中……我该如何处理它,而不必对我的API进行不必要的强调(用于计算状态)。

我考虑过做类似“只要从存储库中获取任何东西,就首先更新所有BlogPost的状态并将其保存回数据库”之类的方法……这将是一个API调用,价格相对便宜,但我找不到一个用于执行此操作的事件...所有事件都基于单个实体,而不是用于接触存储库。在单个实体事件(例如postLoad)期间保存它会不必要地对所有实体进行api调用...

有人有另一个主意吗?

谢谢

1 个答案:

答案 0 :(得分:1)

您可能想获得以下问题的答案:

  1. 您可以同时要求API提供多种状态吗?还是需要一个一个地进行?

如果您需要发出50个HTTP请求或仅发出一个HTTP请求,那么这非常重要。

  1. 您的API请求的平均往返时间是多少?

Kinda与问题1有关,但仍然...

  1. 每个请求从数据库中获取多少个对象?或者换个说法,每个请求status个更新中有多少个对象是候选对象?

Doctrine在需要发出UPDATE查询时非常聪明,但是如果您使用自己的DQL,就不会那么多。

以上任何答案是否都提示瓶颈?

考虑一下,有两个想法:

想法1:暂时性的内存缓存status

第一个请求:

  1. 从数据库中获取条目
  2. 检查本地内存中的缓存并解决丢失的状态
  3. 将状态放入超时缓存中(例如ttl = 5min或更长时间),每个状态都使用单独的键(例如BlogPost-status-<id>
  4. 在PHP中,根据status字段过滤出您的实体

下一个请求:

  1. 从数据库中获取条目
  2. 检查本地内存中的缓存并解决丢失的状态
  3. 更新您的内存缓存
  4. 在PHP中,根据status字段过滤出您的实体

想法2:持续status

第一个请求:

  1. 从数据库中获取条目
  2. 检查本地内存中的缓存并解决丢失的状态
  3. 将结果写入数据库列

下一个请求:

  1. 通过应用status过滤器从数据库中获取条目
  2. 检查本地内存中的缓存并解决丢失的状态(问题:您只过滤了一些实体,其他实体呢?)
  3. 将API的结果(如果有)写入数据库列

可能还有其他一些相关方法。

希望这会有所帮助...