'default'], [['margin_id'], 'required', 'on' => 'form_upload_validation', 'message' => 'Должен быть указан хотя бы один тип цен.'], [['group'], 'required', 'on' => 'form_upload_validation', 'message' => 'Группа RG - обязательное поле.'], [['importer_id', 'margin_id'], 'integer' , 'on' => 'default'], [['koef'], 'number' , 'on' => 'default'], [['timestamp'], 'safe' , 'on' => 'default'], [['group'], 'string', 'max' => 200 , 'on' => 'default'], ]; } /** * @inheritdoc */ public function attributeLabels() { return [ 'id' => 'ID', 'importer_id' => 'Поставщик', 'margin_id' => 'Тип цены', 'group' => 'ГРУППА', 'koef' => 'Коэффициент', 'timestamp' => 'ДАТА', ]; } 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']); } /** * вставка данных с апдейтом прямым запросом SQL * @param $data - массив вставляемых данный, вставка будет прозводится пакетами размером указанным в константе BATCH * @throws \yii\db\Exception */ //@todo - вынести все ручные инсерты в отдельный класс public static function ManualInsertWithUpdate($data, $keys) { $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}"; Yii::$app->db->createCommand($query)->execute(); } return true; } }