Недавно мы сделали это в проекте с данными CSV. это было довольно безболезненно. Есть плагин Symfony tmCsvPlugin, но мы его немного расширили, так как версия в репозитории плагинов довольно устарела. Нужно добавить это в список @TODO:)
Вопрос 1:
Я не знаю точно о производительности, но я бы предположил, что добавление записей в Doctrine_Collection и затем вызов Doctrine_Collection :: save () было бы самым подходящим подходом. Я уверен, что это было бы удобно, если бы где-то было сгенерировано исключение, и вам пришлось откатиться при последнем сохранении ..
Вопрос 2:
Если бы вы могли использовать поле строки в качестве уникального идентификатора (предположим, имя пользователя), то вы могли бы искать существующую запись. Если вы найдете запись и предполагаете, что ваша импортированная строка является массивом, используйте Doctrine_Record :: synchronizeWithArray (), чтобы обновить эту запись; затем добавьте его в коллекцию Doctrine_Collection. Когда закончите, просто вызовите Doctrine_Collection :: save ()
Довольно грубая и готовая реализация:
// set up a new collection
$collection = new Doctrine_Collection('User');
// assuming $row is an associative
// array representing one imported row.
foreach ($importedRows as $row) {
// try to find an existing record
// based on a unique identifier.
$user = Doctrine_Core::getTable('User')
->findOneByUsername($row['username']);
// create a new user record if
// no existing record is found.
if (!$user instanceof User) {
$user = new User();
}
// sync record with current data.
$user->synchronizeWithArray($row);
// add to collection.
$collection->add($user);
}
// done. save collection.
$collection->save();
Довольно грубо, но что-то вроде этого хорошо сработало для меня. Это предполагает, что вы можете каким-то образом использовать импортированные данные строк в качестве уникального идентификатора.
ПРИМЕЧАНИЕ: будьте осторожны с synchronizeWithArray (), если вы используете sf1.2 / doctrine 1.0 - если я правильно помню, он не был реализован правильно. в доктрине 1.2 это работает нормально.