2014-09-05 49 views
2

我想用symfony2和doctrine2来存储商店的历史数据。比如我有2个实体:如何用symfony和doctrine存储历史数据?

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?我尝试了多对多的映射,但我无法找出使用正确映射的正确方法。

感谢您的帮助!

回答

3

有几件事你必须正确设置才能使其工作。

首先,你需要告诉学说$versions有关Version

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

就是这样。不要忘记为ArrayCollection添加use陈述!

use Doctrine\Common\Collections\ArrayCollection; 
+0

谢谢你的提示。 – Roman 2014-09-06 07:51:55

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.com/simplethings/EntityAudit

+0

您好卡米尔,我需要能够在给定的时间内选择与'商店'相关的'版本'。所以我想跟踪和审核变更,但是对变更有一个历史观点。 “EntityAudit”符合我的计划吗? – Roman 2014-09-06 07:50:43

+1

是的,全球修订表包含:ID,时间戳,用户名和更改注释字段,因此您可以从给定的时间范围查询修订。时间点。要跟踪实体历史记录: $ auditReader-> getEntityHistory('SimpleThings \ EntityAudit \ Tests \ ArticleAudit',$ id = 1); – 2014-09-06 09:33:21