Blame view

backend/models/Details.php 4.78 KB
33d902b8   Mihail   add converter as ...
1
2
3
4
5
6
7
8
9
10
11
  <?php
  /**
   * Created by PhpStorm.
   * User: Cibermag
   * Date: 15.09.2015
   * Time: 16:49
   */
  
  namespace backend\models;
  
  use yii\base\Model;
d7f6bdbb   Mihail   add Importers fil...
12
  use Yii;
33d902b8   Mihail   add converter as ...
13
14
  
  class Details extends Model{
d7f6bdbb   Mihail   add Importers fil...
15
16
      const KEY_COLUMN = ['IMPORT_ID','BRAND','ARTICLE'];
      const BATCH = 500;
33d902b8   Mihail   add converter as ...
17
  
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
      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}}';
      }
  
51514d7d   Mihail   add writing data ...
49
50
51
52
53
54
55
56
57
  //    //@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;
  //    }
d7f6bdbb   Mihail   add Importers fil...
58
59
60
61
62
63
64
  
      /**
       * @param $data - двумерный массив данных для записи в таблицу details
       * @throws \yii\db\Exception
       * вставляет записи с апдейтом при дубляже ключей
       */
      public function save ($data)
33d902b8   Mihail   add converter as ...
65
      {
d7f6bdbb   Mihail   add Importers fil...
66
67
68
69
70
71
72
          $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) {
51514d7d   Mihail   add writing data ...
73
              $query_update .= "{$field} = values({$field}),";
d7f6bdbb   Mihail   add Importers fil...
74
75
76
77
78
79
80
81
82
83
84
85
86
87
          }
          // удалим последнюю запятую
          $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}";
51514d7d   Mihail   add writing data ...
88
             // \common\components\CustomVarDamp::dumpAndDie($query);
d7f6bdbb   Mihail   add Importers fil...
89
90
91
              $res = Yii::$app->db->createCommand($query)->execute();
  
          }
33d902b8   Mihail   add converter as ...
92
93
  
      }
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();