Doctrine-insérer plusieurs rangées avec une seule sauvegarde()

Comment puis-je insérer plusieurs lignes dans la table appelant save() méthode une fois dans Doctrine?

18
demandé sur Almas Adilbek 2011-03-24 09:51:58

5 réponses

Ajouter chaque enregistrement d'un Doctrine_Collection l'appel save() sur l'objet collection.

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

cela ne fonctionne que si tous les enregistrements sont pour la même table. Sinon, vous êtes hors de la chance.

30
répondu xzyfer 2012-09-04 15:41:57

Voici une autre solution, testée sur la Doctrine 1.2. Pas besoin de sauvegarder chaque enregistrement, flush() découvre automatiquement toutes les instances non sauvegardées et les sauve toutes.

$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();
3
répondu Elvis Ciotti 2011-08-25 10:31:54

si vous utilisez symfony2 c'est tellement facile

// 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();
3
répondu Serdar Değirmenci 2015-10-27 15:14:03

1)déclarer toutes les tables. 2)Créer le formulaire. 3) Envoyer à plusieurs tables. 4) données sur la persistance.

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

1)déclarer toutes les tables.

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

2)Créer un formulaire

$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)Insérer dans plusieurs tableaux.

    {

        $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)données persistantes

            $em = $this->getDoctrine()->getManager();
            $em->persist($site);
            $em->persist($nba);
            $em->flush();
1
répondu serializer 2017-10-31 07:14:47

j'ai jeté un coup d'oeil au code de la méthode "save" De La Doctrine (1.2.x) "de la Collection.php" et tout ce que j'ai vu est quelque chose comme ceci:

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

comment cela devrait-il JAMAIS insérer tous les enregistrements avec un INSERT mysql?

0
répondu Del Pedro 2012-04-25 06:15:40