Details.php 4.7 KB
<?php
/**
 * Created by PhpStorm.
 * User: Cibermag
 * Date: 15.09.2015
 * Time: 16:49
 */

namespace backend\models;

use yii\base\Model;
use Yii;

class Details extends Model{
    const KEY_COLUMN = ['IMPORT_ID','BRAND','ARTICLE'];
    const BATCH = 500;

    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}}';
    }

    //@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;
    }

    /**
     * @param $data - двумерный массив данных для записи в таблицу details
     * @throws \yii\db\Exception
     * вставляет записи с апдейтом при дубляже ключей
     */
    public function save ($data)
    {
        $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) {
            $query_update .= "{$field} = values ({$field}),";
        }
        // удалим последнюю запятую
        $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}";

            $res = Yii::$app->db->createCommand($query)->execute();

        }

    }
}

//

//$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();