Blame view

common/models/MarginsGroups.php 3.86 KB
021728bd   Administrator   Importers CRUD
1
2
3
4
  <?php
  
  namespace common\models;
  
c8505745   Administrator   Importers CRUD
5
  use backend\models\Importers;
021728bd   Administrator   Importers CRUD
6
7
8
9
10
11
12
13
14
15
16
17
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
49
  use Yii;
  
  /**
   * This is the model class for table "w_margins_groups".
   *
   * @property integer $id
   * @property integer $importer_id
   * @property integer $margin_id
   * @property string $group
   * @property double $koef
   * @property string $timestamp
   */
  class MarginsGroups extends \yii\db\ActiveRecord
  {
      /**
       * @inheritdoc
       */
      public static function tableName()
      {
          return 'w_margins_groups';
      }
  
      /**
       * @inheritdoc
       */
      public function rules()
      {
          return [
              [['importer_id', 'margin_id', 'group', 'koef'], 'required'],
              [['importer_id', 'margin_id'], 'integer'],
              [['koef'], 'number'],
              [['timestamp'], 'safe'],
              [['group'], 'string', 'max' => 200],
              [['importer_id', 'margin_id', 'group'], 'unique', 'targetAttribute' => ['importer_id', 'margin_id', 'group'], 'message' => 'The combination of Importer ID, Margin ID and Group has already been taken.']
          ];
      }
  
      /**
       * @inheritdoc
       */
      public function attributeLabels()
      {
          return [
              'id' => 'ID',
c8505745   Administrator   Importers CRUD
50
51
52
53
54
              'importer_id' => 'Поставщик',
              'margin_id' => 'Тип цены',
              'group' => 'ГРУППА',
              'koef' => 'Коэффициент',
              'timestamp' => 'ДАТА',
021728bd   Administrator   Importers CRUD
55
56
          ];
      }
c8505745   Administrator   Importers CRUD
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
  
      public function beforeSave($insert)
      {
          if (parent::beforeSave($insert)) {
              $this->timestamp = date("Y-m-d H:i:s");
              return true;
          } else {
              return false;
          }
      }
  
      public function getImporters()
      {
          return $this->hasOne(Importers::className(), ['id' => 'importer_id']);
      }
  
      public function getMargins()
      {
          return $this->hasOne(Margins::className(), ['id' => 'margin_id']);
      }
8b8083ef   Mihail   add manual insert...
77
78
79
80
81
82
83
84
85
86
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
113
114
  
      /**
       * вставка данных с апдейтом прямым запросом SQL
       * @param $data - массив вставляемых данный, вставка будет прозводится пакетами размером указанным в константе BATCH
       * @throws \yii\db\Exception
       */
      //@todo - вынести все ручные инсерты в отдельный класс
      public static function ManualInsertWithUpdate($data, $keys)
      {
          // \common\components\CustomVarDamp::dumpAndDie($data);
          $table_name = self::tableName();
          $keys_arr = array_keys($data[0]);
          // найдем те поля которые не являются ключами. Их нужно будет при дубляже апдейтить
          $fields_arr_to_update = array_diff( $keys_arr, $keys );
  
          $query_update = ' on duplicate key update ';
          foreach ($fields_arr_to_update as $field) {
              $query_update .= "[[{$field}]] = values([[{$field}]]),";
          }
          // удалим последнюю запятую
          $query_update = substr($query_update, 0, strlen($query_update) - 1);
  
          // запросы будем выполнять пакетами
          // размер пакета установлен в константе
          // разобъем массив на пакеты и будем их проходить
          $data = array_chunk($data, 20);
          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}";
              // \common\components\CustomVarDamp::dumpAndDie($query);
              Yii::$app->db->createCommand($query)->execute();
  
          }
      }
021728bd   Administrator   Importers CRUD
115
  }