fix: исправлен импорт CSV с неполным набором столбцов
- Добавлена поддержка импорта CSV файлов с отсутствующими столбцами
- Для отсутствующих столбцов устанавливается NULL (если nullable) или значение по умолчанию
- Автоинкрементные поля корректно пропускаются, счетчик увеличивается автоматически
- Улучшена обработка NULL значений ("NULL", "null", "") - конвертируются в реальный NULL
- Добавлена валидация обязательных полей без значений по умолчанию
This commit is contained in:
@@ -249,13 +249,19 @@ class DataService
|
||||
$errors = 0;
|
||||
$errorMessages = [];
|
||||
|
||||
// ✅ Собираем информацию о всех столбцах таблицы
|
||||
$validColumns = [];
|
||||
foreach ($columns as $c) {
|
||||
$name = $c['COLUMN_NAME'];
|
||||
$extra = $c['EXTRA'] ?? '';
|
||||
|
||||
// Пропускаем только auto_increment поля
|
||||
if (!str_contains($extra, 'auto_increment')) {
|
||||
$validColumns[] = $name;
|
||||
$validColumns[$name] = [
|
||||
'nullable' => $c['IS_NULLABLE'] ?? false,
|
||||
'has_default' => !empty($c['COLUMN_DEFAULT']) || $c['COLUMN_DEFAULT'] === '0',
|
||||
'default' => $c['COLUMN_DEFAULT'] ?? null
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -268,12 +274,36 @@ class DataService
|
||||
$placeholders = [];
|
||||
$params = [];
|
||||
|
||||
foreach ($validColumns as $name) {
|
||||
// ✅ Перебираем ВСЕ столбцы таблицы (кроме auto_increment)
|
||||
foreach ($validColumns as $name => $info) {
|
||||
$value = null;
|
||||
|
||||
// Если столбец есть в CSV строке
|
||||
if (array_key_exists($name, $row)) {
|
||||
$value = $row[$name];
|
||||
|
||||
// ✅ Обрабатываем "NULL" как NULL
|
||||
if (in_array($value, ['NULL', 'null', ''], true)) {
|
||||
$value = null;
|
||||
}
|
||||
} else {
|
||||
// ✅ Столбца нет в CSV - устанавливаем NULL или пропускаем
|
||||
// Если поле имеет значение по умолчанию - пропускаем (БД сама подставит)
|
||||
if ($info['has_default']) {
|
||||
continue;
|
||||
}
|
||||
// Если поле nullable - ставим NULL
|
||||
if ($info['nullable']) {
|
||||
$value = null;
|
||||
} else {
|
||||
// Поле обязательное и нет дефолта - ошибка
|
||||
throw new \PDOException("Missing required field: $name");
|
||||
}
|
||||
}
|
||||
|
||||
$insertCols[] = "`$name`";
|
||||
$placeholders[] = ":$name";
|
||||
$params[":$name"] = $row[$name];
|
||||
}
|
||||
$params[":$name"] = $value;
|
||||
}
|
||||
|
||||
if (empty($insertCols)) {
|
||||
@@ -309,6 +339,7 @@ class DataService
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
public function exportCSV(
|
||||
string $schema,
|
||||
string $table,
|
||||
|
||||
Reference in New Issue
Block a user