mode = $mode; } public function rules() { return [ [['BRAND','ARTICLE', 'PRICE', 'BOX'], 'required' ], ]; } public function formName() { return 'Details'; } public static function tableName() { return '{{%details}}'; } //@todo вероятно этой функции не место здесь public function prepareData ( $data, $configuration ) { if ( isset($configuration['importer_id']) && $configuration['importer_id']) { $data = \Yii::$app->multiparser->addColumn( $data, 'IMPORT_ID', $configuration['importer_id'] ); } // \common\components\CustomVarDamp::dumpAndDie($data); return $data; } /** * @param $data - двумерный массив данных для записи в таблицу details * @throws \yii\db\Exception * вставляет записи с апдейтом при дубляже ключей */ public function save ($data) { $table_name = self::tableName(); $keys_arr = array_keys( $data[0] ); // найдем те поля которые не являются ключами. Их нужно будет при дубляже апдейтить $fields_arr_to_update = array_diff( $keys_arr, $this::KEY_COLUMN ); $query_update = ' on duplicate key update '; foreach ($fields_arr_to_update as $field) { $query_update .= "{$field} = values ({$field}),"; } // удалим последнюю запятую $query_update = substr($query_update, 0, strlen($query_update) - 1); // запросы будем выполнять пакетами // размер пакета установлен в константе // разобъем массив на пакеты и будем их проходить $data = array_chunk($data, $this::BATCH ); foreach( $data as $current_batch_array ){ //воспользуемся пакетной вставкой от фреймворка, плюс сразу с экранированием и защитой от инъекций $query_insert = Yii::$app->db->createCommand()->batchInsert($table_name, $keys_arr, $current_batch_array)->sql; // добавим фрагмент с апдейтом при дубляже $query = "{$query_insert} {$query_update}"; $res = Yii::$app->db->createCommand($query)->execute(); } } } // //$q = " INSERT INTO {$table_name} ({$keys_string}) VALUES ("; //$q .= " on duplicate key update `FULL_ARTICLE` = values (`FULL_ARTICLE`), // `PRICE` = values (`PRICE`), // `DESCR` = values(`DESCR`), // `BOX` = values(`BOX`), // `ADD_BOX` = values(`ADD_BOX`), // `GROUP` = values(`GROUP`);"; // INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6) // ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b); //INSERT INTO `books` (`UserId`, `BookId`, `Count`) VALUES (13, 1001, 3) //ON DUPLICATE KEY UPDATE `Count` = `Count` + VALUES(`Count`); //$values_string = ''; //$keys_arr = array_keys( $data[0] ); //$keys_string = implode( ',', $keys_arr); //$table_name = self::tableName(); //$current_batch = 0; //for ($i = $current_batch; $i < $this::BATCH AND $i < count($data); $i++) { // $values_string .= '(' . implode( ',', $data[$i]) . '),'; //} // for ($current_batch = $this::BATCH; $current_batchdb->createCommand()->batchInsert($table_name, $keys_arr, $data)->sql; //$query = "{$query_insert} on duplicate key update `PRICE` = values (`PRICE`),`DESCR` = values(`DESCR`),`BOX` = values(`BOX`)"; //$res = Yii::$app->db->createCommand($query)->execute(); // Yii::$app->db->createCommand()->batchInsert($table_name, $keys_arr, $data)->sql execute();