Как вы написали свои вложенные циклы foreach
, вы, очевидно, будете использовать ресурсы в геометрической прогрессии.Я также подозреваю, что он не достигнет того, чего вы действительно хотите, так как у вас будет МНОГО дубликатов Supplier
с и Category
с.
Работа с полными сущностями в доктрине также несет в себе огромное количество накладных расходов,но у него есть некоторые преимущества, поэтому я предполагаю, что вы хотите это сделать.
Мой подход к массовому импорту такой, как этот, - работать снизу вверх.В вашем случае это может быть вариант того, что я имею ниже.Предполагается, что у вас есть данные в существующей базе данных, и каждая существующая «сущность» в старой базе данных будет иметь свою собственную уникальную id
.
1 - Импортировать всех поставщиков из старой базы данных в новую базу данных;в новом БД есть столбец с именем oldId
, который ссылается на уникальный id
из старого БД.Перестаньте очищать кэш / память.
2- Извлеките всех поставщиков из новой базы данных в массив, индексированный по их oldId
.Я использую код так:
$suppliers = [];
$_suppliers = $this->em->getRepository(Supplier:class)->findAll();
foreach ($_suppliers as $supplier) {
$suppliers[$supplier->getOldId()] = $supplier;
}
3- Повторите шаг 1 для категорий.Во время импорта ваша старая БД будет иметь ссылку на oldId
связанных поставщиков.Хотя ваш код этого не делает, я предполагаю, что вы хотите сохранить связь между поставщиком и категорией, поэтому теперь вы можете ссылаться на поставщика по его oldId
в цикле над связанными "старыми" поставщиками:
$category->addSupplier($suppliers[ <<oldSupplier Id>> ]);
4- Повторите выше для отдельных элементов, только на этот раз сохраняя связанные категории.
Очевидно, что есть множество настроек, которые могут улучшить это.Суть в том, что касание каждого поставщика один раз, затем касание каждой категории один раз, а затем касание каждого элемента, когда это делается последовательно, будет на несколько порядков быстрее и менее ресурсоемким, чем попытка заняться глубоко вложенным циклом.