Я использую последнюю версию 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);
}
}
}