在Doctrine ORM中保持一个实体的两个不同版本。

问题描述 投票:0回答:1

我正在做一个Symfony4DoctrineMySQL项目,需求如下。

  • 用户可以创建实体(比如说帖子),这些实体只有在管理员批准后才能在公共前台显示。

  • 当用户在审批发布后编辑自己的帖子时,修改后的帖子需要再次被审批,才能在前台显示。但是在审批过程中,旧的已批准版本的帖子必须在前台保持可见。

这意味着我必须为每个 "Post "实体保留两个版本:前台是已批准的版本,后台是正在进行中的版本。

在过去有类似需求的项目中,我尝试过不同的方法来解决这个问题。

  1. 使用 "可版本行为"(这是在Symfony1Propel时代使用sfPropelVersionableBehaviorPlugin)。为了在前端显示,如果一个实体没有被批准,我必须获取之前的版本,直到找到最新的批准版本。

  2. 使用第二个entitydatabase表 "ApprovedPost",其字段定义与主 "Post "实体相同。当一个帖子被管理员批准后,它将被复制到ApprovedPost表中。前台只对 "ApprovedPost "表进行操作。

目前实现这种行为的最佳实践是什么?

symfony doctrine-orm doctrine
1个回答
0
投票

因为我现在正在研究这个问题,所以我想分享一下我的方法,实体是对某个东西的请求。每当某件事情发生变化时,这些变化都应该被保存下来。

这个方法。

  1. 在每次编辑操作时,都会创建一个新的实体行。
  2. 实体有一个 "approved "标志和一个createdAt Date字段。
  3. 一个请求有一个可空的一对一自关系(指向根父实体)。
  4. 一个自定义的存储库被用来访问数据库。
  5. 典型的find和findAll方法被修改:他们搜索最近的版本(通过createdAt字段)被批准。
  6. 搜索是通过自定义SQLDQL来完成的。(WHERE id = ?1 OR WHERE parent-id = ?1) AND WHERE approved = true SORT BY created_at DESC LIMIT 1

可以添加更多的功能,如enableddisabled,delete等。

如果你想在服务器端渲染页面并显示变化的或旧的版本,我建议你写一个Twig扩展。你可以在repo中实现不同的搜索功能,并通过扩展来处理表现(排序,引用...)。我创建了一个API,它能够同时做到这两点:返回最新版本和返回所有版本(有或没有root或newest),但我只在必要时在前端使用后者。

就像dbrumann所说的那样,这是一种有观点的方法(我喜欢自定义的repos,因为我可以创建类型安全的repos,而且我可以将应用程序与持久化逻辑解耦)。

© www.soinside.com 2019 - 2024. All rights reserved.