2011-08-13 22 views
5

私は2つのテーブルAccommodationFacilityを持っています。それらは3番目のテーブルAccommodation_facilityと多対多の関係で接続されています。複数のレコードを同時にテーブルに挿入するにはどうすればよいですか?

  • は、宿泊施設(はaccommodation_id、accommodation_type、名前)
  • ファシリティ(facility_id、facility_name)
  • Accommodation_facilityは(をaccommodation_id、facility_id)のYiiを使用

、方法に複数のデータレコードを挿入できますかテーブル?

答えて

-2

あなたの質問は "yii"でタグ付けされているので、Yii Frameworkを使用していると思います。ドキュメントでアクティブなレコードを見て引き継ぐ - http://www.yiiframework.com/doc/guide/1.1/en/database.ar

あなたのテーブルのARクラスを設定し、単にあなたがあなたのCheckBoxListを提出するときに、投稿データをループするドキュメントに従ってください。このループでは、データを挿入するテーブルのARオブジェクトを作成、設定、保存します。

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

は、1つのレコードのみが挿入されます。おそらく最後のものです。 –

+3

ループ内に複数のレコードを追加するには '$ model-> isNewRecord = true;'が必要です。 –

11

ループを使用した挿入は非常に遅いです。挿入する行が5000行あるとします.6分ほどかかるとします(レコードごとに別々に挿入します)。

$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(); 

これは、時間の1/10の時間がかかります。

+0

より良いexpirienceはSQL注入を防ぐために '$ command-> bindValues'とプレースホルダを使用することです。 – FelikZ

2

SQLインジェクションを防ぐためには、bindParamを使用する方がよいでしょう。私はそれが最良の方法であるかどうかわかりませんが、私はこれをやっている方法があります:

$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(); 

私はこれが役立つことを願っています!あなたのケースで

関連する問題