d7f6bdbb
Mihail
add Importers fil...
|
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
private $mode;
// обязательные поля модели
public $BRAND;
public $ARTICLE;
public $PRICE;
public $BOX;
function __construct($mode)
{
$this->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)
|
d7f6bdbb
Mihail
add Importers fil...
|
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
$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();
}
|
d7f6bdbb
Mihail
add Importers fil...
|
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
}
//
//$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_batch<count($data); $current_batch + $this::BATCH )
//// удалим последнюю запятую
//$values_string = substr($values_string, 0, strlen($values_string) - 1) . ' ';
////\common\components\CustomVarDamp::dumpAndDie($values_string);
//// $query = "INSERT INTO {$table_name}({$keys_string}) VALUES {$values_string}";
//// on duplicate key update `PRICE` = values (`PRICE`),`DESCR` = values(`DESCR`),`BOX` = values(`BOX`)";
//$query_insert = Yii::$app->db->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();
|