События Доктрины, обновление сохраненного объекта

я написал скрипт Importer, который читает записи из файла CSV,
и итерации строк. Для обработки больших файлов без потери производительности,
я вставляю новые данные в серию доктрин (большими).

Моя проблема на данный момент заключается в том, что у меня есть объект «Категория», который должен быть расширен
только в новых записях. Поэтому я должен проверить, доступны ли записи по названию категории.

Мой первый вопрос, я читал, что событие prePersist доктрин будет вызвано по вызову
«$ entityManager-> persist ()» и внутри метода «flush» (http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html#prepersist).

Итак, как я могу проверить, было ли событие внутри флеша?
Следующая вещь, как я могу обновить фактически сущность в данных идентичности?

Я пытаюсь установить идентификатор, но без какого-либо эффекта.

<?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

Решение

Во-первых, я бы порекомендовал использовать 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
// ...
}

?>
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]