Как вставить несколько записей в таблицу одновременно? - PullRequest
5 голосов
/ 13 августа 2011

У меня есть две таблицы Accommodation и Facility, которые связаны во многих отношениях со третьей таблицей Accommodation_facility.

  • Размещение ( Accommodation_id, тип размещения, имя)
  • Объект ( идентификатор_аппарата , имя_устройства)
  • Объект размещения ( номер_ размещения , объект_ид )

Используя Yii, как вы можете вставить несколько записей данных в таблицу Accomodation_facility?

Ответы [ 5 ]

11 голосов
/ 07 февраля 2012

Вставка с использованием цикла очень медленная. Допустим, у вас есть 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 времени.

2 голосов
/ 07 августа 2013

Вам лучше использовать bindParam для предотвращения SQL-инъекций.Я не знаю, является ли это лучшим способом сделать это, но есть способ, которым я делаю это:

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

Надеюсь, это поможет!

0 голосов
/ 19 сентября 2015
//only for 1.1.14
$builder = Yii::app()->db->schema->commandBuilder;
$command=$builder->createMultipleInsertCommand('tbl_post', array(
  array('title' => 'record 1', 'text' => 'text1'),
  array('title' => 'record 2', 'text' => 'text2'),
));
$command->execute();

http://www.yiiframework.com/news/72/yii-1-1-14-release-candidate-is-available/

0 голосов
/ 17 августа 2011
foreach($facilities as $facility)
{ 
    $model = new Model;
    $model->attributes = $facility // or $model->column = $facility
    if ($model->validate())
        $model->save() 
}
0 голосов
/ 17 августа 2011

Поскольку ваш вопрос помечен как "yii", я полагаю, вы используете Yii Framework.Посмотрите на Active Records в документах - http://www.yiiframework.com/doc/guide/1.1/en/database.ar

Следуйте документам, чтобы настроить классы AR для своих таблиц, и просто циклически перебирать данные, которые вы публикуете, когда вы отправляете свой список флажков.В этом цикле вы создаете, заполняете и сохраняете объекты AR для таблиц, для которых вы хотите вставить данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...