教义事件,更新持久化实体
Posted
技术标签:
【中文标题】教义事件,更新持久化实体【英文标题】:Doctrine Events, update persisted entity 【发布时间】:2014-12-17 15:05:32 【问题描述】:我编写了一个 Importer 脚本,它从 csv 文件中读取条目, 并迭代行。为了处理大文件而不损失性能, 我在学说批次(批量)中插入新数据。
我目前的问题是,我有一个“类别”实体,应该扩展它 仅在新条目中。所以我必须检查给定类别名称的条目是否可用。
我的第一个问题是,我已经读到“prePersist”事件将随叫随到 "$entityManager->persist()" 和 "flush" 方法内部 (http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html#prepersist)。
那么我如何检查事件是否在刷新中? 接下来,如何更新身份数据中的实际实体?
我尝试设置id,但没有任何效果。
<?php
/**
* @return \Doctrine\Commong\Collections\ArrayCollection
*/
public function getCategories()
if (null === $this->categories)
$this->categories = $this->getServiceCategory()->findAll();
return $this->categories;
public function prePersist(LifecycleEventArgs $event)
$entity = $event->getEntity();
$objectManager = $event->getObjectManager();
if ($entity instanceof \Application\Entity\Category)
$categories = $this->getCategories();
$entityCriteria = // buildCriteria from Entity;
$matched = $categories->matching($entityCriteria);
if ($matched->count() > 0)
$entity->setId($matched->first()->getId();
所以,我不知道如何更新持久的类别实体? 这是正确的事件,还是应该是其他事件对我的情况有更好的解决方案?
我在 zf2 和教义 2 中开发了导入。
问候
【问题讨论】:
【参考方案1】:首先,我建议在您的导入脚本中使用 DQL 而不是 ORM 实体,因为它使您的代码更加简单。
您的导入过程会提高性能,如果您首先 (1.) 从您的数据库中读取所有现有的“类别”,将它们保存在成员变量中,然后 (2.) 迭代每个 csv 行并将其类别外键与最初阅读的类别集。
如果您的数据库中已经存在该类别,则使用现有的对应外键创建一个新实体行,否则创建一个新类别并创建一个与新类别关联的新实体行。
<?php
// read categories from database
$categories = "..."; /* e.g. array('A' => 1,
'B' => 2, ...); */
// ...
// Iterate each csv row
foreach($csvRows as $csvRow)
// check category name
if(!array_key_exists($csvRow['category']), $categories)
// Create new Category
// Remember id of the new created category
$categoryId = "...";
else
// Use already existing category id
$categoryId = $categories[$csvRow['category']];
// Create new csv row entity with category foreign key
// ...
?>
【讨论】:
以上是关于教义事件,更新持久化实体的主要内容,如果未能解决你的问题,请参考以下文章