2011-08-13 7 views
5

J'ai deux tables Accommodation et Facility, qui sont connectés dans une relation many-to-many avec une troisième table, Accommodation_facility.Comment insérer plusieurs enregistrements dans une table en même temps?

  • Hébergement (accommodation_id, accommodation_type, nom)
  • Facility (facility_id, facility_name)
  • Accommodation_facility (accommodation_id, facility_id)

En utilisant Yii, comment pouvez-vous insérer plusieurs enregistrements de données dans le Accomodation_facility tableau?

Répondre

-2

Étant donné que votre question est marquée «yii», je suppose que vous utilisez Yii Framework. Jetez un coup d'œil à Active Records sur les docs - http://www.yiiframework.com/doc/guide/1.1/en/database.ar

Suivez les docs pour configurer des classes AR pour vos tables, et faites simplement une boucle sur les données que vous postez lorsque vous soumettez votre checkboxlist. Dans cette boucle, vous créez, remplissez et enregistrez les objets AR pour les tables pour lesquelles vous souhaitez insérer des données.

0
foreach($facilities as $facility) 
{ 
    $model = new Model; 
    $model->attributes = $facility // or $model->column = $facility 
    if ($model->validate()) 
     $model->save() 
} 
+0

dans votre cas un seul enregistrement sera inséré. probablement le dernier. –

+3

Il devrait y avoir '$ model-> isNewRecord = true;' afin d'ajouter plusieurs enregistrements dans la boucle. –

11

L'insertion à l'aide d'une boucle est très lente. Disons que vous avez 5000 lignes à insérer, cela prendra environ 6 minutes de cette façon (insert séparé pour chaque enregistrement). Il est préférable d'insérer les données avec une seule requête:

$values = '(null, "your string"), (null, "next string"), (null, "third string")'; 
$sql = 'INSERT INTO table_data (id, data) VALUES ' . $values; 
$command = Yii::app()->db->createCommand($sql); 
$command->execute(); 

Cela prendra 1/10 du temps.

+0

La meilleure expirience est d'utiliser '$ command-> bindValues' et des espaces réservés puis des données brutes pour empêcher l'injection SQL. – FelikZ

2

Il vaut mieux utiliser bindParam pour empêcher les injections SQL. Je ne sais pas si elle est la meilleure façon de le faire, mais il y a la façon dont je fais ceci:

$values = array(array(1,2),array(3,4),array(5,6),); 
$nbValues = count($values); 
$sql = 'INSERT INTO table_name (col_name1, col_name2) VALUES '; 
for ($i=0; $i < $nbValues; $i++) { 
    $sql .= '(:col1_'.$i.', :col2_'.$i.')'; 
    if ($i !== ($nbValues-1)) 
     $sql .= ','; 
} 
$command = Yii::app()->db->createCommand($sql); 
for ($i=0; $i < $nbValues; $i++) { 
    $command->bindParam(':col1_'.$i, $values[$i][0], PDO::PARAM_INT); 
    $command->bindParam(':col2_'.$i, $values[$i][1], PDO::PARAM_INT); 
} 
$command->execute(); 

Hope this helps!

Questions connexes