教义事件,更新持久化实体

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
    // ...


?>

【讨论】:

以上是关于教义事件,更新持久化实体的主要内容,如果未能解决你的问题,请参考以下文章

坚持时的教义关联完整性约束

JPA:持久化/更新孩子期间的事件通知?

关联的教义 postLoad 事件

实体框架持久化计算列问题

工作流中的数据持久化详解!Activiti框架中JPA的使用分析

属性持久化的 SQLAlchemy ORM 事件挂钩