Doctrine Events,更新持久化实体

时间:2014-12-17 15:05:33

标签: php events doctrine-orm zend-framework2

我写了一个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中开发了导入。

问候

1 个答案:

答案 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
    // ...
}

?>