33d902b8
Mihail
add converter as ...
|
1
|
<?php
|
33d902b8
Mihail
add converter as ...
|
2
3
4
|
namespace backend\models;
|
66adbd63
Mihail
sinhronize with s...
|
5
|
use common\components\CustomVarDamp;
|
d7f6bdbb
Mihail
add Importers fil...
|
6
|
use Yii;
|
1c9309e1
Mihail
add view for deta...
|
7
|
use backend\components\base\BaseActiveRecord;
|
33d902b8
Mihail
add converter as ...
|
8
|
|
1c9309e1
Mihail
add view for deta...
|
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
/**
* This is the model class for table "{{%details}}".
*
* @property string $ID
* @property string $IMPORT_ID
* @property string $BRAND
* @property string $ARTICLE
* @property string $FULL_ARTICLE
* @property double $PRICE
* @property string $DESCR
* @property string $BOX
* @property string $ADD_BOX
* @property string $GROUP
* @property string $timestamp
|
cd79d3f3
Mihail
parser
|
23
24
|
*
*
|
1c9309e1
Mihail
add view for deta...
|
25
26
27
|
*/
class Details extends BaseActiveRecord
{
|
66adbd63
Mihail
sinhronize with s...
|
28
29
30
|
/**
*обязательные колонки
*/
|
811bbfad
Mihail
add custom test f...
|
31
|
const KEY_COLUMN = 'IMPORT_ID~~BRAND~~ARTICLE';
|
66adbd63
Mihail
sinhronize with s...
|
32
33
34
35
|
/**
* int - размер пакета запроса
*/
|
811bbfad
Mihail
add custom test f...
|
36
|
const BATCH = 500;
|
66adbd63
Mihail
sinhronize with s...
|
37
38
39
40
|
/**
* @var bool - признак необходимости удалить префикс Артикула перед вставкой
*/
|
cb2d2d18
Mihail
merge with server
|
41
|
|
66adbd63
Mihail
sinhronize with s...
|
42
43
|
public $delete_price = false;
|
1c9309e1
Mihail
add view for deta...
|
44
45
46
47
|
/**
* @inheritdoc
*/
public static function tableName()
|
d7f6bdbb
Mihail
add Importers fil...
|
48
|
{
|
1c9309e1
Mihail
add view for deta...
|
49
|
return '{{%details}}';
|
d7f6bdbb
Mihail
add Importers fil...
|
50
51
|
}
|
1c9309e1
Mihail
add view for deta...
|
52
53
54
|
/**
* @inheritdoc
*/
|
d7f6bdbb
Mihail
add Importers fil...
|
55
56
57
|
public function rules()
{
return [
|
66adbd63
Mihail
sinhronize with s...
|
58
|
[['BRAND', 'ARTICLE', 'PRICE', 'DESCR', 'BOX'], 'required'],
|
1c9309e1
Mihail
add view for deta...
|
59
|
[['PRICE'], 'number'],
|
ef41533d
Mihail
temp commit - wor...
|
60
|
[['BOX'], 'integer'],
|
1c9309e1
Mihail
add view for deta...
|
61
62
63
64
|
[['timestamp'], 'safe'],
[['BRAND', 'ARTICLE'], 'string', 'max' => 100],
[['FULL_ARTICLE'], 'string', 'max' => 150],
[['DESCR', 'GROUP'], 'string', 'max' => 200]
|
d7f6bdbb
Mihail
add Importers fil...
|
65
66
67
|
];
}
|
1c9309e1
Mihail
add view for deta...
|
68
69
70
71
|
/**
* @inheritdoc
*/
public function attributeLabels()
|
d7f6bdbb
Mihail
add Importers fil...
|
72
|
{
|
1c9309e1
Mihail
add view for deta...
|
73
74
75
76
77
78
79
80
81
82
83
84
85
|
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'),
];
|
d7f6bdbb
Mihail
add Importers fil...
|
86
87
|
}
|
66adbd63
Mihail
sinhronize with s...
|
88
89
90
91
92
93
|
/**
*удаление (если $delete_price установлен)б а затем вставка данных с апдейтом прямымыми запросоми SQL
* @param $data - массив вставляемых данных, вставка будет прозводится пакетами размером указанным в константе BATCH
* @param $importer_id - (int) - идентификатор поставщика у которого будет сперва удалены прайсы а потом вставлены из массива $data
* @throws \yii\db\Exception
*/
|
edfa67b1
Mihail
add delete price ...
|
94
|
public function manualInsert($data, $importer_id)
|
66adbd63
Mihail
sinhronize with s...
|
95
96
97
|
{
if ($this->delete_price) {
// запустим пакетное удаление всех прайсов поставщика
|
edfa67b1
Mihail
add delete price ...
|
98
99
|
$conditions = "IMPORT_ID = {$importer_id}";
$this->manualDelete( $conditions );
|
6ccb6e69
Mihail
add delete price ...
|
100
|
}
|
edfa67b1
Mihail
add delete price ...
|
101
|
$this->manualInsertWithUpdate($data);
|
6ccb6e69
Mihail
add delete price ...
|
102
|
|
66adbd63
Mihail
sinhronize with s...
|
103
104
105
106
107
108
109
|
}
/**
* вставка данных с апдейтом прямым запросом SQL
* @param $data - массив вставляемых данный, вставка будет прозводится пакетами размером указанным в константе BATCH
* @throws \yii\db\Exception
*/
|
edfa67b1
Mihail
add delete price ...
|
110
|
private function manualInsertWithUpdate($data)
|
33d902b8
Mihail
add converter as ...
|
111
|
{
|
d7f6bdbb
Mihail
add Importers fil...
|
112
|
$table_name = self::tableName();
|
66adbd63
Mihail
sinhronize with s...
|
113
|
$keys_arr = array_keys($data[0]);
|
d7f6bdbb
Mihail
add Importers fil...
|
114
|
// найдем те поля которые не являются ключами. Их нужно будет при дубляже апдейтить
|
811bbfad
Mihail
add custom test f...
|
115
|
$fields_arr_to_update = array_diff($keys_arr, explode('~~', $this::KEY_COLUMN ));
|
d7f6bdbb
Mihail
add Importers fil...
|
116
117
118
|
$query_update = ' on duplicate key update ';
foreach ($fields_arr_to_update as $field) {
|
48b58a13
Mihail
finish with xml a...
|
119
|
$query_update .= "[[{$field}]] = values([[{$field}]]),";
|
d7f6bdbb
Mihail
add Importers fil...
|
120
121
122
123
124
125
126
|
}
// удалим последнюю запятую
$query_update = substr($query_update, 0, strlen($query_update) - 1);
// запросы будем выполнять пакетами
// размер пакета установлен в константе
// разобъем массив на пакеты и будем их проходить
|
66adbd63
Mihail
sinhronize with s...
|
127
128
|
$data = array_chunk($data, $this::BATCH);
foreach ($data as $current_batch_array) {
|
d7f6bdbb
Mihail
add Importers fil...
|
129
|
|
66adbd63
Mihail
sinhronize with s...
|
130
|
//воспользуемся пакетной вставкой от фреймворка
|
d7f6bdbb
Mihail
add Importers fil...
|
131
|
$query_insert = Yii::$app->db->createCommand()->batchInsert($table_name, $keys_arr, $current_batch_array)->sql;
|
1fd14fc9
Mihail
fixed errors with...
|
132
|
|
d7f6bdbb
Mihail
add Importers fil...
|
133
134
|
// добавим фрагмент с апдейтом при дубляже
$query = "{$query_insert} {$query_update}";
|
1c9309e1
Mihail
add view for deta...
|
135
|
// \common\components\CustomVarDamp::dumpAndDie($query);
|
66adbd63
Mihail
sinhronize with s...
|
136
|
Yii::$app->db->createCommand($query)->execute();
|
d7f6bdbb
Mihail
add Importers fil...
|
137
138
|
}
|
33d902b8
Mihail
add converter as ...
|
139
|
}
|
ef41533d
Mihail
temp commit - wor...
|
140
|
|
6ccb6e69
Mihail
add delete price ...
|
141
|
public function manualDelete( $conditions, $params = [] )
|
edfa67b1
Mihail
add delete price ...
|
142
143
|
{
do {
|
6ccb6e69
Mihail
add delete price ...
|
144
145
|
$query = Yii::$app->db->createCommand()->delete( self::tableName(), $conditions, $params )->sql . ' Limit ' . $this::BATCH;
// try {
|
edfa67b1
Mihail
add delete price ...
|
146
|
$res = Yii::$app->db->createCommand($query)->execute();
|
6ccb6e69
Mihail
add delete price ...
|
147
148
149
|
// } catch (\Exception $e) {
// throw new \ErrorException('Ошибка удаления товаров '.$e->getMessage());
// }
|
edfa67b1
Mihail
add delete price ...
|
150
151
152
153
154
|
} while ($res);
return true;
}
|
d7f6bdbb
Mihail
add Importers fil...
|
155
|
}
|