Sequelize هو ORM المستندة إلى وعد للعقدة. مزيد من المعلومات: http://docs.sequelizejs.com/

كيفية تحديد تسلسل الجمعيات باستخدام الهجرات

يعد Sequelize CLI رائعًا في إنشاء ملفات النماذج والترحيل ، ولكن ليس في إضافة الارتباطات مع الطرز الأخرى.

لسوء الحظ ، لا يوجد الكثير من الوثائق (الواضحة) حول إضافة الارتباطات في ملفات الترحيل - لذلك ، ومع اكتشاف ذلك بنفسي ، قررت الكتابة على أمثلة أساسية لأنواع الجمعيات الأربع لتوفير الوقت للآخرين.

خلق نماذج

أقترح إنشاء جميع النماذج أولاً ، ثم إضافة اقترانات في ملف ترحيل منفصل. هذا يمنع الأخطاء المحيطة النماذج التي لا وجود لها حتى الآن. بالنسبة لي ، فقد ثبت أن هذا هو أسهل طريقة للحصول على قاعدة البيانات حتى الحالة الأولية.

مثال لترتيب الملفات:

  • إنشاء tags.js
  • إنشاء products.js
  • إنشاء orders.js
  • إنشاء customers.js
  • إنشاء payments.js
  • إضافة associations.js

قم بإنشاء جميع النماذج وترحيلها باستخدام النموذج التالي: إنشاء.

للتحقق مما إذا تم إنشاء النماذج بشكل صحيح ، أقترح تشغيل sequelize db: ترحيل ومعرفة ما إذا كان هناك أي أخطاء.

ملاحظة: إذا تلقيت رسالة خطأ تقول "يجب توفير اللهجة بوضوح اعتبارًا من الإصدار 4.0.0" ، فقم بتصدير NODE_ENV من التهيئة أولاً ، على سبيل المثال تصدير NODE_ENV = "محلي"

إذا لم تكن هناك أخطاء ، فيمكننا الانتقال إلى الخطوة التالية.

مضيفا الجمعيات

بناءً على حجم مشروعك ، يمكنك تقسيم الارتباطات لكل نموذج ، أو تضمينها جميعًا في ملف واحد. عند بدء مشروع ، أحب أن أقوم به جميعًا في ملف واحد ، ولكن الأمر يرجع إلى التفضيل الشخصي وعدد الجمعيات التي يمتلكها كل نموذج.

أولاً ، دعنا ننشئ ملف الترحيل حيث سنقوم بجميع الارتباطات: تسلسل الترحيل: إنشاء - إضافات - اسم المجال.

ينتمي إلى

وفقًا للوثائق ، فإن العلاقة الخاصة بـ "تضيف مفتاحًا أجنبيًا ومزيجًا فريدًا إلى المصدر".

في مثالنا ، ينتمي الطلب إلى عميل. في هذه الحالة ، يكون المصدر هو "طلب" لذلك سنحتاج إلى إضافة مفتاح CustomerId إلى جدول الطلبات.

ملاحظة: أنا أستخدم UUID معرفاتي. إذا كنت تستخدم الأعداد الصحيحة القياسية فقم بتغيير النوع إلى DataTypes.INTEGER ، قم بإزالة خط defaultValue وقم بتغيير autoIncrement إلى true.

في ملف الترحيل الخاص بنا ، سنحتاج إلى إضافة عمود يسمى CustomerId. يمكن القيام بذلك باستخدام أسلوب queryInterface.addColumn. نحتاج أيضًا إلى توفير وظيفة لأسفل ستعيد قاعدة البيانات إلى الحالة قبل الترحيل.

هناك بعض الأشياء التي يجب ملاحظتها هنا:

  • أسماء الجداول هي صيغة الجمع والمفتاح المرجعي يشبه تمامًا المفتاح المستخدم عند تحديد النماذج (معظم الوقت سيكون عليه).
  • يتم تكبير المفتاح الخارجي.
  • نحن نحدد أيضًا onUpdate و onDelete. الإعداد الافتراضي هو CASCADE للتحديث و SET NULL للحذف بالنسبة لـ ownTo و hasOne و hasMany. سيكون لدى جمعيات BelongsToMany CASCADE افتراضيًا لكل من التحديث والحذف.

ملاحظة: إذا كنت تستخدم أعدادًا صحيحة بدلاً من نوع استخدام UUID: Sequelize.INTEGER.

حفظ وتشغيل sequelize ديسيبل: ترحيل. إذا كان كل شيء على ما يرام ، فلنشغل تسلسل db: الترحيل: التراجع للتحقق مما إذا كانت وظيفة التراجع تعمل أيضًا.

لديه واحد

عند تحديد علاقة hasOne ، يتم إضافة المفتاح الخارجي على الهدف.

في مثالنا ، يحتوي الدفع على طلب واحد. الطلب هو الهدف لذلك سنحتاج إلى إضافة مفتاح PaymentId إلى نموذج الطلب.

دعنا نضيف ترحيلنا لمفتاح hasOne. نحن نلحق عملية الترحيل هذه بـ add-association.js بحيث يبدو الملف كاملاً كما يلي:

لاحظ أننا نقوم بتقييد أساليب queryInterface لأنهم يعرضون الوعود.

لنقم بتسلسل الديسيبل: الترحيل مرة أخرى. في حالة عدم وجود أخطاء ، قم بتشغيل sequelize db: الترحيل: التراجع للتحقق مما إذا كانت وظيفة التعطل لدينا تعمل أيضًا أم لا.

hasMany

تقوم رابطة hasMany "بإنشاء ارتباط 1: m بين المصدر والهدف المقدم. يتم إضافة المفتاح الخارجي على الهدف. "

في مثالنا ، يحتوي الطلب على العديد من المنتجات. لنقم بتحديث ملف نموذج order.js الخاص بنا.

نحتاج الآن إلى إضافة عمود OrderId إلى جدول المنتجات في ملف الترحيل:

واضحة ومباشرة جدا :)

belongsToMany

هذا هو المكان الذي يصبح فيه الأمر أكثر تعقيدًا بقليل. تنشئ علاقة تنتمي إلى علاقة ن: م من خلال جدول الصلة.

في مثالنا ، ينتمي المنتج إلى العديد من علامات التمييز والعكس. فيما يلي تعريفات النموذج:

لاحظ ما يلي:

  • نحن نحدد من خلال: "ProductTags". يحدد هذا أننا نقوم بتخزين اقتران n: m في جدول ProductTags.
  • نحن نحدد رابطة ينتمي إلى كلا النموذجين باستخدام نفس من خلال.

لإبقاء الأمور أكثر إيجازًا ، سأُنشئ ملف ترحيل جديدًا لهذا الارتباط من خلال تشغيل متابعة الترحيل: إنشاء - اسم علامة المنتج - المنتسب.

بدلاً من queryInterface.addColumn ، نحتاج الآن إلى استخدام queryInterface.createTable.

هذا الجدول لا يحتاج إلى مفتاح معرف. يرجى ملاحظة أن ProductId و TagId كلاهما مفتاحان أساسيان. بالنسبة للوظيفة السفلية ، نحن فقط نسقط الطاولة مرة أخرى.

تشغيل sequelize db: الترحيل مرة أخرى ومعرفة ما إذا كان يعمل. لا تنس اختبار الوظيفة لأسفل عن طريق تشغيل sequelize db: migrate: undo.

منجز

هذا هو! آمل أن تساعد هذه الأمثلة الأساسية وتوفر لك بعض الوقت. إذا كان لديك أي أسئلة، لا تتردد في طلب.