2010-10-23 25 views
2

Dans mon application j'ai une boucle qui exécute environ 1000 fois, à l'intérieur je crée l'objet et l'enregistre. C'est la partie de l'application où je peuple ma base de données avec des données. En commun cela ressemble à ceci:insertion multiple dans kohana orm3

foreach(...){ 
    ... 
    try{ 
     $object = new Model_Whatever; 
     $object->whatever=$whatever; 
     $object->save();} 
    catch(Exception $e){ 
    ...} 
} 
        } 

Cela produit 1000 requêtes INSERT. Est-il possible, d'une certaine manière, fait kohana produire des inserts multiples. Divisez ceci en 10 insertions avec 100 ensembles de données dans chacun. Est-ce possible et si oui, comment le fait-on?

Répondre

11

Alors que le Kohana ORM ne supporte pas les insertions multiples, vous pouvez toujours utiliser le générateur de requête comme suit:

$query = DB::insert('tablename', array('column1', 'column2','column3')); 
foreach ($data as $d) { 
    $query->values($d); 
} 
try { 
    $result = $query->execute(); 
} catch (Database_Exception $e) { 
     echo $e->getMessage(); 
} 
  • vous avez encore besoin de partager les données de façon à ce qui précède ne pas essayez d'exécuter une requête avec 1000 insertions.
  • $ data suppose un tableau de tableaux avec les valeurs correspondant à l'ordre des colonnes

grâce Isa dans #kohana

+0

aussi la question est de savoir comment mettre en œuvre "insérer ignorer"? Lors de l'ajout de 100 enregistrements, l'un d'entre eux peut déjà exister dans la base de données et, dans ce cas, l'ajout des 100 enregistrements sera refusé. – SET

0

travail php très lent lorsque insert tableau multi très grand (de sorte que la méthode: : les valeurs ont array_merge) donc plus rapide:

class Database_Query_Builder_Bath_Insert 
    extends Database_Query_Builder_Insert{ 

    public static function doExecute($table, $data) { 
     $insertQuery = DB::insert($table, array_keys(current($data))); 

     $insertQuery->_values = $data; 

     $insertQuery->execute(); 
    } 
} 
0
call_user_func_array([$query, 'values'], $data);