如何过滤ArrayCollection?

时间:2014-04-15 17:09:23

标签: symfony architecture filter doctrine-orm

假设我有一个Asset实体,它本身与其他实体有多种关系,例如CategoryLabels以及Tag。如果符合某些条件,Asset应处于某种状态,请将其称为quarantine

我们说Asset在没有Category的情况下处于隔离状态。我应该如何检查这种情况?

我可以在其实体isInQurantine中添加一个标志,并将其存储在persist / update中。这将使查询变得便宜。

我可以通过其filter方法适应ArrayCollection,但这意味着加载所有结果然后减少结果集。这可能是一种更简单的方法,但我怀疑如果ArrayCollection变大,它会在长期内咬我。

最后,我偶然发现doctrine filters似乎(没有检查过,可能是完全错误的)我也可以在不需要db-flag的情况下进行过滤,然后才会应用约束水化。

我不确定如何继续。

我想要一个能够同时保持性能(我认为不包括ArrayCollection过滤)和可维护性的解决方案。与将来一样,要求可能会发生变化,而不仅仅是缺少类别。

至于可维护性,我认为我可以添加和删除Doctrine过滤器的过滤器。

我想建议一下解决方案的优缺点,或者我是否有一种完全错过的方法。

1 个答案:

答案 0 :(得分:3)

你基本上有3个选择:

  1. 获取整个集合并在之后过滤(非常慢=气味)
  2. 通过检查实际关系(非常慢)来获取您需要的条目
  3. 通过检查计数(仍然很慢+复杂=气味)来存储关系计数和提取
  4. 选项1显然根本没有意义。使用选项3,您可以轻松地以损坏的应用程序状态结束(计数/状态标志与实际状态/计数不匹配)。

    现在有什么解决方案? 您应该缓存选项2的结果。

    创建postPersist / postUpdate / postRemove学说订阅者,触发续订结果缓存而不让客户端等待。

    在订阅者内部执行缓存升温到kernel.terminate事件(在发送响应之后)...或在定期执行的cronjob内(即在用户活动较少的时间)

    通过这种方式,您可以确保结果绝对匹配真实的数据库状态,具有最佳性能(客户端不必等待数据库查询)......并且没有不必要的代码膨胀您的实体+增加复杂性。< / p>