2011-03-24 28 views

Respuesta

30

Agregue cada registro a Doctrine_Collection la llamada save() en el objeto de colección.

$collection = new Doctrine_Collection('tablename'); 
$collection->add($record1); 
$collection->add($record2); 
$collection->add($record3); 
$collection->add($record4); 
$collection->save(); 

Esto solo funciona si todos los registros son para la misma tabla. De lo contrario, no tienes suerte.

+0

Gracias, exactamente lo que estaba buscando. –

+11

¡Esto es perfecto! Insertar 1000 filas tomó solo 3.8s en vez de 76s. – Populus

+0

¿Hay alguna forma de obtener insertar un registro primero y obtener su ID y agregar el resto e insertar todos los demás? – Pramod

3

Aquí otra solución, probada en Doctrine 1.2. No es necesario guardar cada registro, el flush() averigua automáticamente todas las instancias no guardadas y las guarda todas.

$row = new \My_Doctrine_Record(); 
$row->name = 'aaa'; 
$row->approved = 1; 

/// ... 

$row = new \My_Doctrine_Record(); 
$row->name = 'val'; 
$row->approved = 'bbb'; 

Doctrine_Manager::connection()->flush(); 
+0

Estoy confundido. Usted dice que no hay necesidad de instanciar nuevos registros, pero eso es exactamente lo que está haciendo en su código cuando repetidamente dice '$ row = new My_Doctrine_Record();', ¿verdad? –

+0

ops, quise decir "no es necesario guardar cada registro". Lo cambiaré –

0

Me tomó un vistazo en el código del método de "salvar" de la Doctrina (1.2.x) "Collection.php" y todo lo que vi es algo como esto:

foreach ($this->getData() as $key => $record) { 
    $record->save($conn); 
} 

Cómo ¿Debería esto insertar todos los registros con un mysql INSERT?

+1

Su extracto en Collection.php está envuelto por '$ conn-> beginInternalTransaction()' y '$ conn-> commit()'. Eso podría explicarlo. – Tapper

+1

Gracias por su comentario, pero por ejemplo: MySQL MyISAM no admite transacciones ... –

3

Si utiliza Symfony2 es tan fácil

// get the manager 
$em = $this->getDoctrine()->getManager(); 

// enter the records 
$em->persist($entitiy1); 
$em->persist($entitiy2); 
$em->persist($entitiy3); 
$em->persist($entitiy4); 
$em->persist($entitiy5); 

// save the entries 
$em->flush(); 
1

1) Declarar todas las mesas. 2) Crea el formulario. 3) Enviar a varias tablas. 4) Persistir datos.

use AppBundle\Entity\site; 
use AppBundle\Entity\nba; 

1) Declarar todas las mesas.

$site = new site; 
$nba = new nba; 

2) Crear forma

$form = $this->createFormBuilder($site) 




    ->add('site_id', IntegerType::class, array('attr' => array('class' => 'form-control', 'style' => 'margin-bottom:15px'))) 
    ->add('category', ChoiceType::class, array('attr' => array('class' => 'form-control', 'style' => 'margin-bottom:15px'), 'choices' => $output)) 
    ->add('team', ChoiceType::class, array('attr' => array('class' => 'form-control', 'style' => 'margin-bottom:15px'), 'choices' => $nbat)) 
    ->add('save', SubmitType::class, array('label' => "Create",'attr' => array('class' => 'btn btn-success', 'style' => 'margin-bottom:15px'))) 
    ->getForm(); 
    $form->handleRequest($request); 
    if($form->isSubmitted() && $form->isValid()) 

3) Insertar en varias tablas.

{ 

     $site_id = $form['site_id']->getData(); 
     $category = $form['category']->getData(); 
     $team = $form['team']->getData(); 




     $site->setSiteId($site_id); 
     $site->setCategory($category); 
     $nba->setWinner($team); 

4) conservar los datos

  $em = $this->getDoctrine()->getManager(); 
      $em->persist($site); 
      $em->persist($nba); 
      $em->flush(); 
Cuestiones relacionadas