/** * Add missing fields to existing database table * * @param string $schema String name of schema to use to get fields * @param string $verbose_output string used to log added fields * * @return bool true if fields added successfully, false otherwise */ public static function addMissingModelFieldsToDb($schema, $plugin_name = null, $verbose_output = null) { if (!DinklyDataConfig::setActiveConnection($schema)) { return false; } //If no DB exists, create one try { $db = DinklyDataConnector::fetchDB(); } catch (PDOException $e) { if ($e->getCode() == 1049) { self::createDb($schema, DinklyDataConfig::getDBCreds()); $db = DinklyDataConnector::fetchDB(); } } $model_names = DinklyBuilder::getAllModels($schema); //Gather up yaml configs for each model $model_yaml = $table_names = array(); foreach ($model_names as $model) { $model_yaml[$model] = self::parseModelYaml($schema, $model, $plugin_name, false); $table_names[$model] = $model_yaml[$model]['table_name']; } //Create index for matching tables and columns within the yaml config $yaml_fields = array(); foreach ($model_yaml as $y) { $yaml_fields[$y['table_name']] = array(); foreach ($y['registry'] as $field_name) { $name = null; if (is_array($field_name)) { $name = key($field_name); } else { $name = $field_name; } $yaml_fields[$y['table_name']][] = $name; } } //Create a very similar index, for matching tables and columns within the existing database $db_table_fields = array(); foreach ($table_names as $table_name) { $query = "show columns from " . $table_name; $results = $db->query($query)->fetchAll(); $db_table_fields[$table_name] = array(); foreach ($results as $k => $v) { $db_table_fields[$table_name][] = $v['Field']; } } //Find any fields that are in the yaml, but are not in the database currently $fields_to_add = array(); foreach ($yaml_fields as $table_name => $yaml_field_list) { foreach ($yaml_field_list as $field_name) { if (!in_array($field_name, $db_table_fields[$table_name])) { if (!isset($fields_to_add[$table_name])) { $fields_to_add[$table_name] = array(); } $fields_to_add[$table_name][] = $field_name; } } } //For each field missing from the database, but present in the yaml, run an alter query foreach ($fields_to_add as $table => $field_list) { foreach ($field_list as $field) { $registry = $model_yaml[Dinkly::convertToCamelCase($table, true)]['registry']; foreach ($registry as $field_config) { $sql = null; if (is_array($field_config)) { if (key($field_config) == $field) { $sql = self::genTableAlterQuery($db, $table, $field_config); } } else { if ($field == $field_config) { $sql = self::genTableAlterQuery($db, $table, $field_config); } } if ($sql) { if ($verbose_output) { echo "Adding field " . $field . " to " . $table . "...\n"; } $db->exec($sql); } } } } }