2011-08-13 41 views
5

Tôi có hai bảng AccommodationFacility, được kết nối trong mối quan hệ nhiều-nhiều với bảng thứ ba, Accommodation_facility.Làm thế nào để bạn chèn nhiều bản ghi vào một bảng cùng một lúc?

  • trọ (accommodation_id, Accommodation_Type, tên)
  • sở (facility_id, facility_name)
  • Accommodation_facility (accommodation_id, facility_id)

Sử dụng Yii, làm thế nào bạn có thể chèn nhiều bản ghi dữ liệu vàokhôngbảng?

Trả lời

-2

Vì câu hỏi của bạn được gắn thẻ trong "yii", tôi đoán bạn đang sử dụng Yii Framework. Hãy xem Bản ghi hoạt động qua tài liệu - http://www.yiiframework.com/doc/guide/1.1/en/database.ar

Làm theo tài liệu để thiết lập lớp học AR cho bảng của bạn và chỉ cần lặp lại dữ liệu bạn đăng khi bạn gửi danh sách kiểm tra. Trong vòng lặp này bạn tạo, điền và lưu các đối tượng AR cho các bảng mà bạn muốn chèn dữ liệu.

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

trong trường hợp của bạn chỉ có một hồ sơ sẽ được chèn vào. có lẽ là cuối cùng. –

+3

Nên có '$ model-> isNewRecord = true;' để thêm nhiều bản ghi trong vòng lặp. –

11

Chèn sử dụng vòng lặp rất chậm. Giả sử bạn có 5000 hàng để chèn, sẽ mất khoảng 6 phút theo cách đó (chèn riêng cho mỗi bản ghi). Tốt hơn là chèn dữ liệu bằng một truy vấn:

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

Điều đó sẽ mất 1/10 thời gian.

+0

Sự hết hạn tốt hơn là sử dụng '$ command-> bindValues' và trình giữ chỗ rồi dữ liệu thô để ngăn chặn việc tiêm SQL. – FelikZ

2

Bạn tốt hơn phải sử dụng bindParam để ngăn chặn việc tiêm SQL. Tôi không biết nếu đó là cách tốt nhất để làm điều đó, nhưng có cách tôi đang làm điều này:

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

Hy vọng điều này sẽ giúp!

Các vấn đề liên quan