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

时间:2014-09-05 23:53:03

标签: symfony doctrine-orm doctrine

我想用symfony2和doctrine2存储商店历史数据。例如,我有2个实体:

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

和第二个实体:

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

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

每次更改Shop的版本时,我都希望将此更改存储为具有版本更改的历史视图。

我如何用symfony2和doctrine2做到这一点?我尝试了多对多映射,但我无法使用正确的映射找出正确的方法。

感谢您的帮助!

3 个答案:

答案 0 :(得分: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关系(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);
}

就是这样。不要忘记为use添加ArrayCollection声明!

use Doctrine\Common\Collections\ArrayCollection;

答案 1 :(得分: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-&gt; findEntitiesChangedAtRevision(10);

以及更多内容:https://github.com/simplethings/EntityAudit

答案 2 :(得分:0)

另一个用于实体版本控制的软件包是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

为了检索给定时间范围内的logEntries,您可以扩展从以下方法返回的querybuilder,该方法在LogEntryRepository中也可用:

public function getLogEntriesQueryBuilder($entity)