【问题标题】:How to store historical data with symfony and doctrine?如何用 symfony 和教义存储历史数据?
【发布时间】:2014-09-05 23:53:03
【问题描述】:

我想用 symfony2 和教义 2 存储历史数据。例如我有 2 个实体:

class Shop
{
     private $id;
     private $url;
     private $version;
}

和第二个实体:

class Version
{
     private $id;
     private $software;
     private $version;
}

版本实体存储特定的商店版本,例如Magento 1.2OXID eShop 4.7 - 因此版本实体的条目应该是可重用的。

每次Shop 的版本更改时,我都想存储此更改以获取版本更改的历史视图。

我怎样才能用 symfony2 和教义 2 做到这一点?我尝试了多对多映射,但我无法找出使用正确映射的正确方法。

感谢您的帮助!

【问题讨论】:

  • 究竟尝试了什么?

标签: symfony doctrine-orm doctrine


【解决方案1】:

您必须正确设置一些东西才能使其正常工作。

首先,你需要告诉 Doctrine $versionsVersion 有关:

class Shop
{
     private $id;
     private $url;

    /**
     * @ORM\ManyToMany(targetEntity="Version", cascade={"persist"})
     * @ORM\JoinTable(name="shop_version",
     *      joinColumns={@ORM\JoinColumn(name="shop_id", referencedColumnName="id")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="version_id", referencedColumnName="id")}
     *      )
     */
    private $versions;
}

由于它是ManyToMany 关系(documentation),$versions 将被 Symfony 视为 ArrayCollection。因此,您需要创建相应的方法来处理它。

构造函数

public function __construct()
{
    $this->versions = new ArrayCollection();
}

吸气剂

public function getVersions()
{
    return $this->versions;
}

加法器

public function addVersion(Version $version)
{
    $this->versions[] = $version;
}

卸妆

public function removeVersion(Version $version)
{
    $this->versions->removeElement($version);
}

就是这样。不要忘记为ArrayCollection 添加use 语句!

use Doctrine\Common\Collections\ArrayCollection;

【讨论】:

    【解决方案2】:

    在您的情况下,我建议不要重新发明轮子,而是推荐 Doctrine2 扩展:EntityAudit,它允许对实体及其关联进行完整版本控制。用法:

    $auditReader = $this->container->get("simplethings_entityaudit.reader");
    
    // find entity state at a particular revision
    $articleAudit = $auditReader->find('SimpleThings\EntityAudit\Tests\ArticleAudit', $id = 1, $rev = 10);
    
    // find Revision History of an audited entity
    $revisions = $auditReader->findRevisions('SimpleThings\EntityAudit\Tests\ArticleAudit', $id = 1);
    
    // find Changed Entities at a specific revision
    $changedEntities = $auditReader->findEntitiesChangedAtRevision( 10 );
    

    更多信息:https://github.com/simplethings/EntityAudit

    【讨论】:

    • 嗨,Kamil,我需要能够在给定的时间范围内选择与Shop 相关的Version。所以我想跟踪和审计更改,但对更改有一个历史视图。 EntityAudit 适合我的计划吗?
    • 是的,全局修订表包含:id、时间戳、用户名和更改评论字段,因此您可以查询给定时间范围内的修订。时间点。跟踪实体历史: $auditReader->getEntityHistory('SimpleThings\EntityAudit\Tests\ArticleAudit', $id = 1);
    【解决方案3】:

    另一个可用的实体版本控制包是https://github.com/madmis/ActivityLogBundle。该软件包包括一个修订控制系统,可保存所需实体和属性的每个状态。

    要启用日志记录,请将以下注释添加到您的实体类

    @Gedmo\Loggable(logEntryClass="ActivityLogBundle\Entity\LogEntry")
    

    确保导入注解

    use Gedmo\Mapping\Annotation as Gedmo;
    

    将以下注释添加到要记录更改的属性中

    @Gedmo\Versioned
    

    该包提供了轻松检索实体日志的方法

    public function getLogEntriesQuery($entity)
    

    这将使用以下方法返回日志条目

    $logEntry->getVersion() //returns entities revision version
    $logEntry->getOldData() //returns data state before updating
    $logEntry->getData() //returns data state after updating
    $logEntry->getLoggedAt() //returns when de log was created
    

    为了检索给定时间范围内的日志条目,您可以扩展从以下方法返回的查询构建器,该方法也可在 LogEntryRepository 中使用:

    public function getLogEntriesQueryBuilder($entity)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-12
      • 2015-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多