Validarea schemei
Când schemele evoluează între instantanee (se adaugă, elimină sau redenumesc coloane), merql detectează și raportează aceste diferențe. Nepotrivirile dintre scheme nu blochează îmbinarea, dar sunt semnalate pentru ca apelantul să decidă cum să procedeze.
Detectare
SchemaValidator::validate() compară seturile de coloane ale fiecărui tabel din instantaneele base, ours și theirs. Raportează:
- Coloane adăugate în ours (prezente în ours, dar absente din base)
- Coloane eliminate din ours (prezente în base, dar absente din ours)
- Coloane adăugate în theirs
- Coloane eliminate din theirs
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"
}
}
Ce se detectează
| Modificare | Detectată | Note |
|---|---|---|
| Coloană adăugată | Da | Raportată pentru fiecare parte (ours/theirs) |
| Coloană eliminată | Da | Raportată pentru fiecare parte |
| Tip de coloană schimbat | Nu | Tipurile sunt stocate, dar nu sunt comparate |
| Coloană redenumită | Nu | Apare ca adăugare + eliminare |
| Cheie primară schimbată | Nu | Identitatea este fixată la momentul capturării instantaneului |
Comportamentul în timpul îmbinării
Când o coloană există într-un instantaneu, dar nu în altul, îmbinarea tratează valoarea coloanei absente ca null. Asta înseamnă:
- O coloană adăugată în theirs cu o valoare non-null apare ca
null -> value(acceptată ca modificare din theirs) - O coloană eliminată în theirs apare ca având
nullpentru toate rândurile din theirs
Îmbinarea continuă și produce un rezultat. Nepotrivirile dintre scheme sunt informative. Apelantul trebuie să verifice dacă schema bazei de date țintă corespunde datelor îmbinate înainte de aplicare.
Accesarea nepotrivirilor
Nepotrivirile dintre scheme sunt disponibile atât în ThreeWayMerge (prin schemaMismatches()), cât și în MergeResult (prin schemaMismatches() și hasSchemaMismatches()). Acestea sunt păstrate prin ConflictResolver::resolve().
// 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
}