如何用symfony和doctrine存储历史数据?

问题描述 投票:2回答:2

我想用symfony2和doctrine2来存储历史数据。例如,我有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和doctrine2?

如何使用symfony2和doctrine2做到这一点?我试过很多对很多的映射,但我不知道如何使用正确的映射。

谢谢你的帮助!我想用symfony2和doctrine2存储历史数据。

symfony doctrine-orm doctrine
2个回答
3
投票

有几件事情你必须正确设置才能实现。

首先,你需要告诉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 关系(文件), $versions 将被视为 ArrayCollection 由Symfony提供。因此,你需要创建相应的方法来处理它。

构造函数

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);
}

就这样吧 不要忘了加上 use 声明 ArrayCollection!

use Doctrine\Common\Collections\ArrayCollection;

1
投票

在你的情况下,与其重新发明轮子,不如推荐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.comsimplethingsEntityAudit。


0
投票

另一个可用的实体版本管理包是 https:/github.commadmisActivityLogBundle。. 这个包包含了一个版本控制系统,它可以保存你所需要的实体和属性的每个状态。

要启用日志记录,在你的实体类中添加以下注解。

@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

为了检索给定时间段的logEntries,你可以扩展从以下方法返回的querybuilder,它在LogEntryRepository中也是可用的。

public function getLogEntriesQueryBuilder($entity)
© www.soinside.com 2019 - 2024. All rights reserved.