假设我有一个Asset
实体,它本身与其他实体有多种关系,例如Category
和Labels
以及Tag
。如果符合某些条件,Asset
应处于某种状态,请将其称为quarantine
。
我们说Asset
在没有Category
的情况下处于隔离状态。我应该如何检查这种情况?
我可以在其实体isInQurantine
中添加一个标志,并将其存储在persist / update中。这将使查询变得便宜。
我可以通过其filter
方法适应ArrayCollection,但这意味着加载所有结果然后减少结果集。这可能是一种更简单的方法,但我怀疑如果ArrayCollection变大,它会在长期内咬我。
最后,我偶然发现doctrine filters似乎(没有检查过,可能是完全错误的)我也可以在不需要db-flag的情况下进行过滤,然后才会应用约束水化。
我不确定如何继续。
我想要一个能够同时保持性能(我认为不包括ArrayCollection过滤)和可维护性的解决方案。与将来一样,要求可能会发生变化,而不仅仅是缺少类别。
至于可维护性,我认为我可以添加和删除Doctrine过滤器的过滤器。
我想建议一下解决方案的优缺点,或者我是否有一种完全错过的方法。
答案 0 :(得分:3)
你基本上有3个选择:
选项1显然根本没有意义。使用选项3,您可以轻松地以损坏的应用程序状态结束(计数/状态标志与实际状态/计数不匹配)。
现在有什么解决方案? 您应该缓存选项2的结果。
创建postPersist
/ postUpdate
/ postRemove
学说订阅者,触发续订结果缓存而不让客户端等待。
在订阅者内部执行缓存升温到kernel.terminate
事件(在发送响应之后)...或在定期执行的cronjob内(即在用户活动较少的时间)
通过这种方式,您可以确保结果绝对匹配真实的数据库状态,具有最佳性能(客户端不必等待数据库查询)......并且没有不必要的代码膨胀您的实体+增加复杂性。< / p>