首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何过滤ArrayCollection?

如何过滤ArrayCollection?
EN

Stack Overflow用户
提问于 2014-04-15 17:09:23
回答 1查看 1.7K关注 0票数 2

假设我有一个Asset实体,它本身与其他实体有多个关系,例如CategoryLabelsTag。如果满足某些条件,则Asset应该处于状态,让我们将其称为quarantine

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

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

我可以通过ArrayCollection的filter方法来修正它,但是这意味着加载所有的结果,然后减少结果集。这可能是一种更简单的方法,但我怀疑从长远来看,如果ArrayCollection变得很大,它会咬我一口。

最后,我偶然发现了学说过滤器,它似乎(还没有检查过,可能是完全错误的),我也可以进行过滤,而不需要一个db标志-约束将在水化之前应用。

我不知道该怎么做。

我想要一个同时兼顾性能(我认为不包括ArrayCollection过滤)和可维护性的解决方案。与今后一样,需求可能会发生变化,不仅仅包括缺乏类别。

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

我希望有人建议解决方案有哪些优点和缺点,或者如果有什么办法我完全错过了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-15 19:46:27

你基本上有三个选择:

  1. 取出整个收集,然后过滤(非常慢=气味)
  2. 仅通过检查实际关系(相当慢)获取所需的条目。
  3. 通过检查计数来存储关系计数和获取(仍然缓慢+复合=嗅觉)

显然,选项1完全没有意义。使用选项3,您可以很容易地进入损坏的应用程序状态(count/state标志与实际状态/count不匹配)。

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

创建一个postPersist / postUpdate / postRemove原则订阅服务器,在不让客户端等待的情况下触发结果缓存的更新。

或者在订阅服务器内执行kernel.terminate事件的缓存升温(在发送响应之后).或者在周期性执行的cronjob内部(即在用户活动较少的时候)。

这样您就可以确保结果绝对匹配一个真实的数据库状态,有最好的性能(没有数据库查询客户端必须等待).并且没有不必要的代码膨胀你的实体+增加复杂性。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23090186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档