100], [['FULL_ARTICLE'], 'string', 'max' => 150], [['DESCR', 'GROUP'], 'string', 'max' => 200] ]; } /** * @inheritdoc */ public function attributeLabels() { return [ 'ID' => Yii::t('app', 'ID'), 'IMPORT_ID' => Yii::t('app', 'Import ID'), 'BRAND' => Yii::t('app', 'Brand'), 'ARTICLE' => Yii::t('app', 'Article'), 'FULL_ARTICLE' => Yii::t('app', 'Full Article'), 'PRICE' => Yii::t('app', 'Price'), 'DESCR' => Yii::t('app', 'Descr'), 'BOX' => Yii::t('app', 'Box'), 'ADD_BOX' => Yii::t('app', 'Add Box'), 'GROUP' => Yii::t('app', 'Group'), 'timestamp' => Yii::t('app', 'Timestamp'), ]; } public function ManualInsert ($data) { // \common\components\CustomVarDamp::dumpAndDie($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}"; // \common\components\CustomVarDamp::dumpAndDie($query); $res = Yii::$app->db->createCommand($query)->execute(); } } }