我想用symfony2和doctrine2存储商店历史数据。例如,我有2个实体:
class Shop
{
private $id;
private $url;
private $version;
}
和第二个实体:
class Version
{
private $id;
private $software;
private $version;
}
Version实体存储特定的商店版本,例如Magento 1.2
或OXID eShop 4.7
- 因此版本实体的条目应该是可重用的。
每次更改Shop
的版本时,我都希望将此更改存储为具有版本更改的历史视图。
我如何用symfony2和doctrine2做到这一点?我尝试了多对多映射,但我无法使用正确的映射找出正确的方法。
感谢您的帮助!
答案 0 :(得分:3)
为了实现这一点,您必须正确设置一些内容。
首先,您需要告诉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
关系(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);
答案 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)