Commit 42078ac69f543f844040a491f33ea2d0509569a5
1 parent
2d5bfb36
add manual insert func to margin grup model
Showing
2 changed files
with
67 additions
and
36 deletions
Show diff stats
backend/controllers/RgGrupController.php
@@ -20,7 +20,8 @@ use yii\data\ArrayDataProvider; | @@ -20,7 +20,8 @@ use yii\data\ArrayDataProvider; | ||
20 | use yii\multiparser\DynamicFormHelper; | 20 | use yii\multiparser\DynamicFormHelper; |
21 | use common\components\CustomArrayHelper; | 21 | use common\components\CustomArrayHelper; |
22 | 22 | ||
23 | -class RgGrupController extends BaseController { | 23 | +class RgGrupController extends BaseController |
24 | +{ | ||
24 | public $layout = "/column"; | 25 | public $layout = "/column"; |
25 | 26 | ||
26 | /** | 27 | /** |
@@ -79,9 +80,9 @@ class RgGrupController extends BaseController { | @@ -79,9 +80,9 @@ class RgGrupController extends BaseController { | ||
79 | // не прошла валидация форма загрузки файлов | 80 | // не прошла валидация форма загрузки файлов |
80 | $errors_str = ''; | 81 | $errors_str = ''; |
81 | foreach ($model->getErrors() as $error) { | 82 | foreach ($model->getErrors() as $error) { |
82 | - $errors_str .= implode( array_values($error) ); | 83 | + $errors_str .= implode(array_values($error)); |
83 | } | 84 | } |
84 | - throw new \ErrorException( $errors_str ); | 85 | + throw new \ErrorException($errors_str); |
85 | } | 86 | } |
86 | // листаем пагинатором, или повторно вызываем - считываем из кеша отпрасенные данные | 87 | // листаем пагинатором, или повторно вызываем - считываем из кеша отпрасенные данные |
87 | } else if (Yii::$app->getCache()->get('parser_data')) { | 88 | } else if (Yii::$app->getCache()->get('parser_data')) { |
@@ -95,11 +96,10 @@ class RgGrupController extends BaseController { | @@ -95,11 +96,10 @@ class RgGrupController extends BaseController { | ||
95 | 'pageSize' => 10, | 96 | 'pageSize' => 10, |
96 | ], | 97 | ], |
97 | ]); | 98 | ]); |
98 | - | ||
99 | // создадим модель на столько реквизитов сколько колонок в отпарсенном файле | 99 | // создадим модель на столько реквизитов сколько колонок в отпарсенном файле |
100 | - $last_index = end( array_flip( $data[0] ) ); | 100 | + $last_index = end(array_flip($data[0])); |
101 | $header_counts = $last_index + 1; | 101 | $header_counts = $last_index + 1; |
102 | - $header_model = DynamicFormHelper::CreateDynamicModel( $header_counts ); | 102 | + $header_model = DynamicFormHelper::CreateDynamicModel($header_counts); |
103 | 103 | ||
104 | // соберем массив данных из которых будет пользователь выбирать значения в конструкторе (выпадающий список) | 104 | // соберем массив данных из которых будет пользователь выбирать значения в конструкторе (выпадающий список) |
105 | $header_array = Margins::getHeader(); | 105 | $header_array = Margins::getHeader(); |
@@ -137,18 +137,18 @@ class RgGrupController extends BaseController { | @@ -137,18 +137,18 @@ class RgGrupController extends BaseController { | ||
137 | throw new \ErrorException('Ошибка кеша'); | 137 | throw new \ErrorException('Ошибка кеша'); |
138 | } | 138 | } |
139 | 139 | ||
140 | - array_walk($arr, function(&$val){ | ||
141 | - $val = '!'.$val; | 140 | + array_walk($arr, function (&$val) { |
141 | + $val = '!' . $val; | ||
142 | }); | 142 | }); |
143 | 143 | ||
144 | // соотнесем отпарсенные данные с соответсивем полученным от пользователя | 144 | // соотнесем отпарсенные данные с соответсивем полученным от пользователя |
145 | // для этого преобразуем массив отпарсенных данных - назначим ключи согласно соответствию | 145 | // для этого преобразуем массив отпарсенных данных - назначим ключи согласно соответствию |
146 | - $data = CustomArrayHelper::createAssocArray( $data, $arr , 'attr_' ); | 146 | + $data = CustomArrayHelper::createAssocArray($data, $arr, 'attr_'); |
147 | 147 | ||
148 | // в первой строке у нас заголовки - уберем | 148 | // в первой строке у нас заголовки - уберем |
149 | unset($data[0]); | 149 | unset($data[0]); |
150 | // подготовим данные для записи в таблицу w_margins_groups | 150 | // подготовим данные для записи в таблицу w_margins_groups |
151 | - //$arr_values = []; | 151 | + $arr_values = []; |
152 | $group = ''; | 152 | $group = ''; |
153 | $importer_id = $configuration['importer_id']; | 153 | $importer_id = $configuration['importer_id']; |
154 | foreach ($data as $row_data) { | 154 | foreach ($data as $row_data) { |
@@ -162,39 +162,32 @@ class RgGrupController extends BaseController { | @@ -162,39 +162,32 @@ class RgGrupController extends BaseController { | ||
162 | } | 162 | } |
163 | 163 | ||
164 | foreach ($row_data as $key => $value) { | 164 | foreach ($row_data as $key => $value) { |
165 | - if($group) | ||
166 | - $row['group'] = trim( $group ); | ||
167 | - | ||
168 | - $row['importer_id'] = trim( $importer_id ); | ||
169 | - $row['margin_id'] = ltrim($key,'!'); | ||
170 | - $row['koef'] = \Yii::$app->converter->convertTo( 'float', $value ); | ||
171 | - | ||
172 | - // сохраним подготовленные данные | ||
173 | - $margins_groups = new MarginsGroups(); | ||
174 | - $margins_groups->attributes = $row; | ||
175 | - | ||
176 | - if ( !$margins_groups->save() ) { | ||
177 | - $errors_str = ''; | ||
178 | - foreach ($margins_groups->getErrors() as $error) { | ||
179 | - $errors_str .= implode( array_values($error) ); | ||
180 | - } | ||
181 | - throw new \ErrorException( $errors_str ); | 165 | + if ($group) |
166 | + $row['group'] = trim($group); | ||
167 | + | ||
168 | + $row['importer_id'] = trim($importer_id); | ||
169 | + $row['margin_id'] = ltrim($key, '!'); | ||
170 | + $row['koef'] = \Yii::$app->converter->convertTo('float', $value); | ||
171 | + | ||
172 | + $arr_values[] = $row; | ||
173 | + | ||
182 | } | 174 | } |
183 | - } | ||
184 | 175 | ||
185 | - Yii::$app->session->setFlash('success'); | ||
186 | - // все прошло успешно - очищаем кеш | ||
187 | - Yii::$app->getCache()->delete('parser_data'); | ||
188 | - Yii::$app->getCache()->delete('parser_configuration'); | 176 | + } |
177 | + // сохраним подготовленные данные | ||
178 | + MarginsGroups::ManualInsertWithUpdate( $arr_values, [ 'group','importer_id','margin_id' ] ); | ||
189 | 179 | ||
190 | - if( file_exists($configuration['file_path']) ) | ||
191 | - unlink($configuration['file_path']); | ||
192 | 180 | ||
193 | - return $this->render('index', ['model' => $configuration]); | 181 | + Yii::$app->session->setFlash('success', "Файл {$configuration['file']} успешно загружен"); |
182 | + // все прошло успешно - очищаем кеш | ||
183 | + Yii::$app->getCache()->delete('parser_data'); | ||
184 | + Yii::$app->getCache()->delete('parser_configuration'); | ||
194 | 185 | ||
186 | + if (file_exists($configuration['file_path'])) | ||
187 | + unlink($configuration['file_path']); | ||
195 | 188 | ||
189 | + return $this->render('index', ['model' => $configuration]); | ||
196 | 190 | ||
197 | - } | ||
198 | 191 | ||
199 | } | 192 | } |
200 | 193 |
common/models/MarginsGroups.php
@@ -74,4 +74,42 @@ class MarginsGroups extends \yii\db\ActiveRecord | @@ -74,4 +74,42 @@ class MarginsGroups extends \yii\db\ActiveRecord | ||
74 | { | 74 | { |
75 | return $this->hasOne(Margins::className(), ['id' => 'margin_id']); | 75 | return $this->hasOne(Margins::className(), ['id' => 'margin_id']); |
76 | } | 76 | } |
77 | + | ||
78 | + /** | ||
79 | + * вставка данных с апдейтом прямым запросом SQL | ||
80 | + * @param $data - массив вставляемых данный, вставка будет прозводится пакетами размером указанным в константе BATCH | ||
81 | + * @throws \yii\db\Exception | ||
82 | + */ | ||
83 | + //@todo - вынести все ручные инсерты в отдельный класс | ||
84 | + public static function ManualInsertWithUpdate($data, $keys) | ||
85 | + { | ||
86 | + // \common\components\CustomVarDamp::dumpAndDie($data); | ||
87 | + $table_name = self::tableName(); | ||
88 | + $keys_arr = array_keys($data[0]); | ||
89 | + // найдем те поля которые не являются ключами. Их нужно будет при дубляже апдейтить | ||
90 | + $fields_arr_to_update = array_diff( $keys_arr, $keys ); | ||
91 | + | ||
92 | + $query_update = ' on duplicate key update '; | ||
93 | + foreach ($fields_arr_to_update as $field) { | ||
94 | + $query_update .= "[[{$field}]] = values([[{$field}]]),"; | ||
95 | + } | ||
96 | + // удалим последнюю запятую | ||
97 | + $query_update = substr($query_update, 0, strlen($query_update) - 1); | ||
98 | + | ||
99 | + // запросы будем выполнять пакетами | ||
100 | + // размер пакета установлен в константе | ||
101 | + // разобъем массив на пакеты и будем их проходить | ||
102 | + $data = array_chunk($data, 20); | ||
103 | + foreach ($data as $current_batch_array) { | ||
104 | + | ||
105 | + //воспользуемся пакетной вставкой от фреймворка | ||
106 | + $query_insert = Yii::$app->db->createCommand()->batchInsert($table_name, $keys_arr, $current_batch_array)->sql; | ||
107 | + | ||
108 | + // добавим фрагмент с апдейтом при дубляже | ||
109 | + $query = "{$query_insert} {$query_update}"; | ||
110 | + // \common\components\CustomVarDamp::dumpAndDie($query); | ||
111 | + Yii::$app->db->createCommand($query)->execute(); | ||
112 | + | ||
113 | + } | ||
114 | + } | ||
77 | } | 115 | } |