为持久化和更新实体设置Doctrine Event Listeners是一项非常有用的功能。但这似乎仅限于UPDATE
或INSERT
语句。那么SELECT
个查询呢?
我们假设我有一个托管CMS,其中包含一个共享数据库,其中每条记录都有siteId
表示记录属于某个站点。当我搜索要在给定站点上显示的记录(实体)时,我需要将结果限制为仅特定siteId
的记录。我可以手动限制我的代码中的每个查询,但这有可能遗忘(这可能是一个安全问题)。所以我正在考虑为每个查询自动执行此操作(在某些情况下我可能需要覆盖)。
那么你可以在某种preSelect
事件监听器中操纵DQL或QueryBuilder,以确保我们总是受到siteId的限制吗?
如果是这样,理想情况下我们可以在系统管理界面中覆盖它,我们想要查找所有记录而不管siteId。
这可能吗?这是一个坏主意吗?这闻起来像迷迭香吗?
答案 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级别的实体的行 结果集。这意味着过滤的实体永远不会被水合 (这可能很贵)。