Blame view

backend/models/Details.php 4.78 KB
28253169   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;
8894c93a   Mihail   add Importers fil...
12
  use Yii;
28253169   Mihail   add converter as ...
13
14
  
  class Details extends Model{
8894c93a   Mihail   add Importers fil...
15
16
      const KEY_COLUMN = ['IMPORT_ID','BRAND','ARTICLE'];
      const BATCH = 500;
28253169   Mihail   add converter as ...
17
  
8894c93a   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}}';
      }
  
9dd0fbe4   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;
  //    }
8894c93a   Mihail   add Importers fil...
58
59
60
61
62
63
64
  
      /**
       * @param $data - двумерный массив данных для записи в таблицу details
       * @throws \yii\db\Exception
       * вставляет записи с апдейтом при дубляже ключей
       */
      public function save ($data)
28253169   Mihail   add converter as ...
65
      {
8894c93a   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) {
9dd0fbe4   Mihail   add writing data ...
73
              $query_update .= "{$field} = values({$field}),";
8894c93a   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}";
9dd0fbe4   Mihail   add writing data ...
88
             // \common\components\CustomVarDamp::dumpAndDie($query);
8894c93a   Mihail   add Importers fil...
89
90
91
              $res = Yii::$app->db->createCommand($query)->execute();
  
          }
28253169   Mihail   add converter as ...
92
93
  
      }
8894c93a   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();