symfony2 generate entitymanagerinterface consultas symfony doctrine2

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!