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', '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) { // \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(); } } }