
# التحقق من المخطط

عندما تتطور المخططات بين اللقطات (بإضافة أعمدة أو حذفها أو إعادة تسميتها)، يكتشف merql هذه الاختلافات ويبلغ عنها. لا تمنع اختلافات المخطط الدمج، لكنها تظهر ليقرر المتصل كيفية المتابعة.

## الاكتشاف

يقارن `SchemaValidator::validate()` مجموعات الأعمدة لكل جدول عبر اللقطات الأساسية ولقطتي ours وtheirs. ويبلغ عن:

- الأعمدة المضافة في ours (موجودة في ours وغير موجودة في اللقطة الأساسية)
- الأعمدة المحذوفة من ours (موجودة في اللقطة الأساسية وغير موجودة في ours)
- الأعمدة المضافة في theirs
- الأعمدة المحذوفة من theirs

```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"
    }
}
```

## ما يُكتشف

| التغيير | يُكتشف | ملاحظات |
|---|---|---|
| إضافة عمود | نعم | يُبلّغ عنه لكل جانب (ours/theirs) |
| حذف عمود | نعم | يُبلّغ عنه لكل جانب |
| تغيير نوع العمود | لا | تُخزَّن الأنواع لكن لا تجري مقارنتها |
| إعادة تسمية عمود | لا | يظهر كإضافة وحذف |
| تغيير المفتاح الأساسي | لا | تُثبَّت الهوية وقت إنشاء اللقطة |

## السلوك أثناء الدمج

عندما يوجد عمود في لقطة دون أخرى، يتعامل الدمج مع قيمة العمود المفقودة على أنها `null`. وهذا يعني:

- يظهر العمود المضاف في theirs ذو القيمة غير الفارغة على أنه `null -> value` (ويُقبل بوصفه تغييرًا من theirs)
- يظهر العمود المحذوف من theirs وكأن قيمته `null` في جميع صفوف theirs

يتابع الدمج وينتج نتيجة. اختلافات المخطط معلوماتية. ينبغي للمتصل التحقق من أن مخطط قاعدة البيانات المستهدفة يتوافق مع البيانات المدمجة قبل تطبيقها.

## الوصول إلى حالات عدم التطابق

تتوفر حالات عدم تطابق المخطط في كل من `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
}
```
