【问题标题】: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 中开发了导入。

问候

【问题讨论】:

    标签: php events doctrine-orm zend-framework2


    【解决方案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
        // ...
    }
    
    ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多