Details.php
4.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
65
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
92
93
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
<?php
/**
* Created by PhpStorm.
* User: Cibermag
* Date: 15.09.2015
* Time: 16:49
*/
namespace backend\models;
use yii\base\Model;
use Yii;
class Details extends Model{
const KEY_COLUMN = ['IMPORT_ID','BRAND','ARTICLE'];
const BATCH = 500;
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)
{
$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_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();