
# Валидиране на схемата

Когато схемите се променят между моментните снимки (добавят се, премахват се или преименуват колони), merql открива и съобщава тези разлики. Несъответствията в схемата не блокират сливането, но се показват, за да може извикващият код да реши как да продължи.

## Откриване

`SchemaValidator::validate()` сравнява наборите от колони на всяка таблица в моментните снимки на основата, нашата и тяхната версия. Отчита:

- Колони, добавени в нашата версия (присъстват в нея, но не и в основата)
- Колони, премахнати от нашата версия (присъстват в основата, но не и в нашата)
- Колони, добавени в тяхната версия
- Колони, премахнати от тяхната версия

```php
use Merql\Merge\ThreeWayMerge;

$merge = new ThreeWayMerge();
$result = $merge->merge($base, $ours, $theirs);

if ($result->hasSchemaMismatches()) {
    foreach ($result->schemaMismatches() as $mismatch) {
        echo $mismatch->getMessage() . "\n";
        // "Schema mismatch on table 'posts': columns added in theirs: subtitle"
    }
}
```

## Какво се открива

| Промяна | Открива се | Бележки |
|---|---|---|
| Добавена колона | Да | Отчита се за всяка страна (нашата/тяхната) |
| Премахната колона | Да | Отчита се за всяка страна |
| Променен тип на колона | Не | Типовете се съхраняват, но не се сравняват |
| Преименувана колона | Не | Показва се като добавяне и премахване |
| Променен първичен ключ | Не | Идентичността се фиксира при създаването на моментната снимка |

## Поведение при сливане

Когато дадена колона съществува в една моментна снимка, но не и в друга, сливането приема липсващата стойност на колоната за `null`. Това означава:

- Колона, добавена в тяхната версия с ненулева стойност, се появява като `null -> value` (приема се като тяхна промяна)
- Колона, премахната от тяхната версия, се третира така, сякаш има `null` за всички редове в нея

Сливането продължава и създава резултат. Несъответствията в схемата са информативни. Извикващият код трябва да провери дали схемата на целевата база данни съответства на слетите данни, преди да ги приложи.

## Достъп до несъответствията

Несъответствията в схемата са достъпни както в `ThreeWayMerge` (чрез `schemaMismatches()`), така и в `MergeResult` (чрез `schemaMismatches()` и `hasSchemaMismatches()`). Те се запазват през `ConflictResolver::resolve()`.

```php
// On the merge result directly
$result->hasSchemaMismatches(); // bool
$result->schemaMismatches();    // list<SchemaException>

// Each mismatch is a SchemaException with a descriptive message
foreach ($result->schemaMismatches() as $e) {
    // $e->getMessage() includes table name and column details
}
```
