Blame view

backend/models/Details.php 5.56 KB
33d902b8   Mihail   add converter as ...
1
  <?php
33d902b8   Mihail   add converter as ...
2
3
4
  
  namespace backend\models;
  
40cac1b6   Mihail   add delete func i...
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
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
  {
40cac1b6   Mihail   add delete func i...
26
27
28
29
30
31
32
33
      /**
       *обязательные колонки
       */
      const KEY_COLUMN = ['IMPORT_ID', 'BRAND', 'ARTICLE'];
  
      /**
       * int - размер пакета запроса
       */
d7f6bdbb   Mihail   add Importers fil...
34
      const BATCH = 500;
40cac1b6   Mihail   add delete func i...
35
36
37
38
39
40
41
  
      /**
       * @var bool - признак необходимости удалить префикс Артикула перед вставкой
       */
      public $delete_prefix = false;
      public $delete_price = false;
  
1c9309e1   Mihail   add view for deta...
42
43
44
45
      /**
       * @inheritdoc
       */
      public static function tableName()
d7f6bdbb   Mihail   add Importers fil...
46
      {
1c9309e1   Mihail   add view for deta...
47
          return '{{%details}}';
d7f6bdbb   Mihail   add Importers fil...
48
49
      }
  
1c9309e1   Mihail   add view for deta...
50
51
52
      /**
       * @inheritdoc
       */
d7f6bdbb   Mihail   add Importers fil...
53
54
55
      public function rules()
      {
          return [
40cac1b6   Mihail   add delete func i...
56
57
              [['BRAND', 'ARTICLE', 'PRICE', 'DESCR', 'BOX'], 'required'],
              //  [['IMPORT_ID', 'BOX', 'ADD_BOX'], 'integer'],
1c9309e1   Mihail   add view for deta...
58
              [['PRICE'], 'number'],
ef41533d   Mihail   temp commit - wor...
59
              [['BOX'], 'integer'],
1c9309e1   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]
d7f6bdbb   Mihail   add Importers fil...
64
65
66
          ];
      }
  
1c9309e1   Mihail   add view for deta...
67
68
69
70
      /**
       * @inheritdoc
       */
      public function attributeLabels()
d7f6bdbb   Mihail   add Importers fil...
71
      {
1c9309e1   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'),
          ];
d7f6bdbb   Mihail   add Importers fil...
85
86
      }
  
40cac1b6   Mihail   add delete func i...
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)
33d902b8   Mihail   add converter as ...
113
      {
1fa22312   Mihail   add auto upload a...
114
          // \common\components\CustomVarDamp::dumpAndDie($data);
d7f6bdbb   Mihail   add Importers fil...
115
          $table_name = self::tableName();
40cac1b6   Mihail   add delete func i...
116
          $keys_arr = array_keys($data[0]);
d7f6bdbb   Mihail   add Importers fil...
117
          // найдем те поля которые не являются ключами. Их нужно будет при дубляже апдейтить
40cac1b6   Mihail   add delete func i...
118
          $fields_arr_to_update = array_diff($keys_arr, $this::KEY_COLUMN);
d7f6bdbb   Mihail   add Importers fil...
119
120
121
  
          $query_update = ' on duplicate key update ';
          foreach ($fields_arr_to_update as $field) {
48b58a13   Mihail   finish with xml a...
122
              $query_update .= "[[{$field}]] = values([[{$field}]]),";
d7f6bdbb   Mihail   add Importers fil...
123
124
125
126
127
128
129
          }
          // удалим последнюю запятую
          $query_update = substr($query_update, 0, strlen($query_update) - 1);
  
          // запросы будем выполнять пакетами
          // размер пакета установлен в константе
          // разобъем массив на пакеты и будем их проходить
40cac1b6   Mihail   add delete func i...
130
131
          $data = array_chunk($data, $this::BATCH);
          foreach ($data as $current_batch_array) {
d7f6bdbb   Mihail   add Importers fil...
132
  
a0d1ac87   Mihail   add articul filte...
133
              //воспользуемся пакетной вставкой от фреймворка
d7f6bdbb   Mihail   add Importers fil...
134
              $query_insert = Yii::$app->db->createCommand()->batchInsert($table_name, $keys_arr, $current_batch_array)->sql;
a0d1ac87   Mihail   add articul filte...
135
136
137
              if ($this->delete_prefix) {
                  $query_insert = $this->prepareArticul( $query_insert );
              }
d7f6bdbb   Mihail   add Importers fil...
138
139
              // добавим фрагмент с апдейтом при дубляже
              $query = "{$query_insert} {$query_update}";
1c9309e1   Mihail   add view for deta...
140
              // \common\components\CustomVarDamp::dumpAndDie($query);
a0d1ac87   Mihail   add articul filte...
141
              Yii::$app->db->createCommand($query)->execute();
d7f6bdbb   Mihail   add Importers fil...
142
143
  
          }
33d902b8   Mihail   add converter as ...
144
      }
ef41533d   Mihail   temp commit - wor...
145
  
a0d1ac87   Mihail   add articul filte...
146
147
148
149
      private function prepareArticul( $query_insert ){
          //CustomVarDamp::dumpAndDie($query_insert);
          return $query_insert;
      }
d7f6bdbb   Mihail   add Importers fil...
150
  }