я написал скрипт 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.
С уважением
Во-первых, я бы порекомендовал использовать 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
// ...
}
?>
Других решений пока нет …