Blame view

backend/models/Details.php 5.39 KB
28253169   Mihail   add converter as ...
1
  <?php
28253169   Mihail   add converter as ...
2
3
4
  
  namespace backend\models;
  
9b4db7f3   Mihail   sinhronize with s...
5
  use common\components\CustomVarDamp;
8894c93a   Mihail   add Importers fil...
6
  use Yii;
d682b074   Mihail   add view for deta...
7
  use backend\components\base\BaseActiveRecord;
28253169   Mihail   add converter as ...
8
  
d682b074   Mihail   add view for deta...
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
  /**
   * 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
   */
  class Details extends BaseActiveRecord
  {
9b4db7f3   Mihail   sinhronize with s...
26
27
28
29
30
31
32
33
      /**
       *обязательные колонки
       */
      const KEY_COLUMN = ['IMPORT_ID', 'BRAND', 'ARTICLE'];
  
      /**
       * int - размер пакета запроса
       */
8894c93a   Mihail   add Importers fil...
34
      const BATCH = 500;
9b4db7f3   Mihail   sinhronize with s...
35
36
37
38
  
      /**
       * @var bool - признак необходимости удалить префикс Артикула перед вставкой
       */
021773a2   Mihail   merge with server
39
  
9b4db7f3   Mihail   sinhronize with s...
40
41
      public $delete_price = false;
  
d682b074   Mihail   add view for deta...
42
43
44
45
      /**
       * @inheritdoc
       */
      public static function tableName()
8894c93a   Mihail   add Importers fil...
46
      {
d682b074   Mihail   add view for deta...
47
          return '{{%details}}';
8894c93a   Mihail   add Importers fil...
48
49
      }
  
d682b074   Mihail   add view for deta...
50
51
52
      /**
       * @inheritdoc
       */
8894c93a   Mihail   add Importers fil...
53
54
55
      public function rules()
      {
          return [
9b4db7f3   Mihail   sinhronize with s...
56
57
              [['BRAND', 'ARTICLE', 'PRICE', 'DESCR', 'BOX'], 'required'],
              //  [['IMPORT_ID', 'BOX', 'ADD_BOX'], 'integer'],
d682b074   Mihail   add view for deta...
58
              [['PRICE'], 'number'],
34d480b7   Mihail   temp commit - wor...
59
              [['BOX'], 'integer'],
d682b074   Mihail   add view for deta...
60
61
62
63
              [['timestamp'], 'safe'],
              [['BRAND', 'ARTICLE'], 'string', 'max' => 100],
              [['FULL_ARTICLE'], 'string', 'max' => 150],
              [['DESCR', 'GROUP'], 'string', 'max' => 200]
8894c93a   Mihail   add Importers fil...
64
65
66
          ];
      }
  
d682b074   Mihail   add view for deta...
67
68
69
70
      /**
       * @inheritdoc
       */
      public function attributeLabels()
8894c93a   Mihail   add Importers fil...
71
      {
d682b074   Mihail   add view for deta...
72
73
74
75
76
77
78
79
80
81
82
83
84
          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'),
          ];
8894c93a   Mihail   add Importers fil...
85
86
      }
  
9b4db7f3   Mihail   sinhronize with s...
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
      /**
       *удаление (если $delete_price установлен)б а затем вставка данных с апдейтом прямымыми запросоми SQL
       * @param $data - массив вставляемых данных, вставка будет прозводится пакетами размером указанным в константе BATCH
       * @param $importer_id - (int) - идентификатор поставщика у которого будет сперва удалены прайсы а потом вставлены из массива $data
       * @throws \yii\db\Exception
       */
      public function  ManualInsert($data, $importer_id)
      {
          if ($this->delete_price) {
              // запустим пакетное удаление всех прайсов поставщика
              do {
                  $query = Yii::$app->db->createCommand()->delete(self::tableName(), "IMPORT_ID = {$importer_id}")->sql . ' Limit ' . $this::BATCH;
                  $res = Yii::$app->db->createCommand($query)->execute();
              } while ($res);
  
          }
  
          $this->ManualInsertWithUpdate($data);
      }
  
      /**
       * вставка данных с апдейтом прямым запросом SQL
       * @param $data - массив вставляемых данный, вставка будет прозводится пакетами размером указанным в константе BATCH
       * @throws \yii\db\Exception
       */
      private function ManualInsertWithUpdate($data)
28253169   Mihail   add converter as ...
113
      {
9e481998   Mihail   add auto upload a...
114
          // \common\components\CustomVarDamp::dumpAndDie($data);
8894c93a   Mihail   add Importers fil...
115
          $table_name = self::tableName();
9b4db7f3   Mihail   sinhronize with s...
116
          $keys_arr = array_keys($data[0]);
8894c93a   Mihail   add Importers fil...
117
          // найдем те поля которые не являются ключами. Их нужно будет при дубляже апдейтить
9b4db7f3   Mihail   sinhronize with s...
118
          $fields_arr_to_update = array_diff($keys_arr, $this::KEY_COLUMN);
8894c93a   Mihail   add Importers fil...
119
120
121
  
          $query_update = ' on duplicate key update ';
          foreach ($fields_arr_to_update as $field) {
0bec979b   Mihail   finish with xml a...
122
              $query_update .= "[[{$field}]] = values([[{$field}]]),";
8894c93a   Mihail   add Importers fil...
123
124
125
126
127
128
129
          }
          // удалим последнюю запятую
          $query_update = substr($query_update, 0, strlen($query_update) - 1);
  
          // запросы будем выполнять пакетами
          // размер пакета установлен в константе
          // разобъем массив на пакеты и будем их проходить
9b4db7f3   Mihail   sinhronize with s...
130
131
          $data = array_chunk($data, $this::BATCH);
          foreach ($data as $current_batch_array) {
8894c93a   Mihail   add Importers fil...
132
  
9b4db7f3   Mihail   sinhronize with s...
133
              //воспользуемся пакетной вставкой от фреймворка
8894c93a   Mihail   add Importers fil...
134
              $query_insert = Yii::$app->db->createCommand()->batchInsert($table_name, $keys_arr, $current_batch_array)->sql;
9b4db7f3   Mihail   sinhronize with s...
135
136
137
              if ($this->delete_prefix) {
                  $query_insert = $this->prepareArticul( $query_insert );
              }
8894c93a   Mihail   add Importers fil...
138
139
              // добавим фрагмент с апдейтом при дубляже
              $query = "{$query_insert} {$query_update}";
d682b074   Mihail   add view for deta...
140
              // \common\components\CustomVarDamp::dumpAndDie($query);
9b4db7f3   Mihail   sinhronize with s...
141
              Yii::$app->db->createCommand($query)->execute();
8894c93a   Mihail   add Importers fil...
142
143
  
          }
28253169   Mihail   add converter as ...
144
      }
34d480b7   Mihail   temp commit - wor...
145
  
8894c93a   Mihail   add Importers fil...
146
  }