有没有办法设置一个Doctrine事件监听器,将每个实体查询限制为特定的字段ID?

时间:2014-12-05 22:26:01

标签: symfony doctrine-orm listeners

为持久化和更新实体设置Doctrine Event Listeners是一项非常有用的功能。但这似乎仅限于UPDATEINSERT语句。那么SELECT个查询呢?

我们假设我有一个托管CMS,其中包含一个共享数据库,其中每条记录都有siteId表示记录属于某个站点。当我搜索要在给定站点上显示的记录(实体)时,我需要将结果限制为仅特定siteId的记录。我可以手动限制我的代码中的每个查询,但这有可能遗忘(这可能是一个安全问题)。所以我正在考虑为每个查询自动执行此操作(在某些情况下我可能需要覆盖)。

那么你可以在某种preSelect事件监听器中操纵DQL或QueryBuilder,以确保我们总是受到siteId的限制吗?

如果是这样,理想情况下我们可以在系统管理界面中覆盖它,我们想要查找所有记录而不管siteId。

这可能吗?这是一个坏主意吗?这闻起来像迷迭香吗?

1 个答案:

答案 0 :(得分:4)

看看Doctrine Filters

Doctrine2 - is there a pre-selection hook?

http://docs.doctrine-project.org/en/latest/reference/filters.html

  

Doctrine 2.2具有允许开发人员添加的过滤系统   SQL到条件子句的查询,无论在哪里   生成SQL(例如,从DQL查询,或通过加载关联   实体)。

     

过滤器功能适用于SQL级别。是否是SQL查询   在延迟加载期间,在Persister中生成,更加懒惰   集合或来自DQL。每次系统迭代所有   启用过滤器,添加新的SQL部件作为过滤器返回。

     

通过将SQL添加到查询的条件子句中,过滤系统   过滤掉属于SQL级别的实体的行   结果集。这意味着过滤的实体永远不会被水合   (这可能很贵)。