我想用symfony2和doctrine2来存储历史数据。例如,我有2个实体。
class Shop
{
private $id;
private $url;
private $version;
}
和第二个实体。
class Version
{
private $id;
private $software;
private $version;
}
版本实体存储了特定的商店版本,比如说 Magento 1.2
或 OXID eShop 4.7
- 所以一个版本实体的条目应该是可重用的。
每当一个版本实体的 Shop
的变化,我想存储这个变化,以便对版本变化有一个历史性的看法,如何使用symfony2和doctrine2?
如何使用symfony2和doctrine2做到这一点?我试过很多对很多的映射,但我不知道如何使用正确的映射。
谢谢你的帮助!我想用symfony2和doctrine2存储历史数据。
有几件事情你必须正确设置才能实现。
首先,你需要告诉Doctrine说 $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
关系(文件), $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;
在你的情况下,与其重新发明轮子,不如推荐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.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)