Миграция схемы в CakePHP, вставка дополнительных данных по умолчанию без изменения схемы - PullRequest
0 голосов
/ 12 июня 2019

Я использую последнюю версию CakePHP 2 и хочу создать схему с помощью инструмента миграции схемы консоли. Я также хочу заполнить базу данных значениями по умолчанию. Это работает до сих пор.

Однако время от времени нашей базе данных требуются дополнительные настройки, которые хранятся в базе данных и могут быть изменены индивидуально. Так что может случиться так, что структура нашей базы данных останется прежней, но, например, 10 дополнительных настроек по умолчанию должны быть вставлены в базу данных при выполнении обновления.

Как можно сделать операторы вставки с Console/cake schema update без обновления самой схемы?

Вот моя идея. Сначала создается таблица wage_costs. Затем в функции after вызывается функция initWageCosts(), которая имеет массив с начальными данными. Функция initWageCost вызывает функцию insertData(), которая отвечает за проверку наличия данных в базе данных или нет. Если этого набора данных нет, данные должны быть вставлены. Пока это работает.

В новом обновлении я хочу расширить исходные данные вторым набором данных без изменения схемы. Как можно вызвать Console/cake schema update и вызвать функцию initWageCosts () также без изменения схемы. Я думал, что достаточно поместить его в функцию after, но ничего не происходит, пока не выполняется обновление схемы.

App::uses('WageCost', 'Model');

class AppSchema extends CakeSchema {

public function before($event = array()) {
    $db = ConnectionManager::getDataSource($this->connection);
    $db->cacheSources = false;
    return true;
}

public function after($event = array()) {
    $this->initWageCosts();
}

public $wage_costs = array(
    'id' => array('type' => 'string', 'null' => false, 'default' => null, 'length' => 36, 'collate' => 'utf8_general_ci', 'charset' => 'utf8', 'key' => 'primary'),
    'type' => array('type' => 'string', 'null' => false, 'default' => null, 'length' => 50, 'collate' => 'utf8_general_ci', 'charset' => 'utf8'),
    'start' => array('type' => 'date', 'null' => false, 'default' => null),
    'multiplier' => array('type' => 'float', 'null' => false, 'default' => null, 'length' => '6,4', 'unsigned' => false),
    'modified' => array('type' => 'timestamp', 'null' => false, 'default' => null),
    'created' => array('type' => 'datetime', 'null' => true, 'default' => null),
    'indexes' => array(

    ),
    'tableParameters' => array('charset' => 'utf8', 'collate' => 'utf8_general_ci', 'engine' => 'InnoDB')
);

    public function initWageCosts(){
    $data = array(
            (int) 0 => array(
                'WageCost' => array(
                    'id' => '694a171a-8563-11e6-baed-00113241b9d5',
                    'type' => 'Mini',
                    'start' => '2015-05-01',
                    'multiplier' => '1.5070',
                    'modified' => '2017-03-27 12:35:09',
                    'created' => null
                )
            )
        );

    $this->insertData($data,'WageCost','type');
}

public function insertData($data,$model,$checkField){
    //Fetch all Data of this table an make CheckField as key for easy Check later
    $modelObj = ClassRegistry::init($model);
    $this->$model->find('all', ['recursive' => -1]);
    $keyArray = Set::combine($data, '{n}.'.$model.'.'.$checkField,'{n}');

    //Go through each to be inserted dataset
    foreach($data as $d){
        //if the to be checked field do not exist in Database, Insert it
        if(empty($keyArray[$d[$model][$checkField]])){
            $this->$model->create();
            $this->$model->save($d);
        }
    }
}
...