我写了一个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和doctrine2中开发了导入。
问候
答案 0 :(得分:0)
首先,我建议您在导入脚本中使用DQL而不是ORM实体,因为它使您的代码更加简单。
如果您首先(1.)从yor数据库中读取所有现有的“Categories”,将它们保存在成员变量中,然后第二次(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
// ...
}
?>