symfony - generate - Doctrine2 $ em-> persist($ entity) en foreach loop
generate entity symfony (3)
Actualmente estoy en un lugar donde necesito crear o actualizar entidades en un bucle foreach.
Así que estoy haciendo lo siguiente (código corto):
foreach ($dataset as $data) {
$entity = new Entity();
// ---- Some setting operations on the entity
$em->persist($entity);
}
$em->flush();
Lo que esperaba es que Doctrine administre las entidades y luego con una declaración inserte las entidades en la tabla.
Pero ocurre que Doctrine hace una declaración para cada entidad creada. Como el conjunto de $ dataset puede ser bastante grande (se crearon muchas entidades), me gustaría tenerlo empaquetado en una sola declaración.
¿Cómo puedo conseguir esto?
Cambiar este código:
foreach ($dataset as $data) {
$entity = new Entity();
// ---- Some setting operations on the entity
$em->persist($entity);
}
a:
foreach ($dataset as $data) {
$entity = new Entity();
// ---- Some setting operations on the entity
$em->persist($entity);
$em->flush();
$em->clear();
}
Como sugiere , este enlace describe cómo Doctrine optimiza las instrucciones INSERT: https://www.slideshare.net/jwage/doctrine-2-not-the-same-old-php-orm/47-sflive2010_Insert_Performance_Inserting_20 (échale un vistazo desde diapositiva # 47). Utiliza transacciones pero no agrupa INSERT de los mismos objetos en una declaración única.
Si realmente necesita dividir la cantidad de datos que pasa a su servidor de base de datos de una vez, le sugiero que procese EntityManager :: flush () cada sentencia x.
De la documentación de Doctrine, dice que las inserciones se realizan mejor con lotes. Y es un desarrollo de la respuesta de @AlterPHP.
Podrías usar:
$batchSize = 20;
for ($i = 1; $i <= 10000; ++$i) {
$car = new Car();
// ... set number of wheels, but should always be to 4 right ?
$em->persist($car);
if (($i % $batchSize) === 0) {
$em->flush();
$em->clear(); // Detaches all objects from Doctrine!
}
}
$em->flush(); // Persist objects that did not make up an entire batch
$em->clear();
PD: acabo de leer eso de Doctrine 13.1. Sección de inserciones masivas . ¡Ahora todo lo que necesitas es un estacionamiento más grande!