المستودعات والعلاقات والاستعلام
المستودعات والعلاقات والاستعلام
المستودع (repository) هو واجهة TypeORM لقراءة وكتابة كيان واحد. يحقنه NestJS لك، وتستدعي دواله من خدمة. يغطّي هذا الدرس عمليات CRUD اليومية، وتعريف العلاقات بين الكيانات، وبناء استعلامات أكثر تقدّمًا.
حقن مستودع
استخدم @InjectRepository() للحصول على مستودع مكتوب النوع لكيان مُسجَّل بـ forFeature():
عمليات CRUD اليومية
create() نسخة كيان في الذاكرة فقط (وتُطبّق القيم الافتراضية) — لا تلمس قاعدة البيانات. وsave() هي ما يُثبّتها. نسيان save() خطأ كلاسيكي بعنوان "لماذا لا يُحفَظ؟".
تعريف العلاقات
تربط العلاقات الكيانات. يوفّر TypeORM مُزخرِفًا لكل تعدّدية. زوج واحد-إلى-كثير / كثير-إلى-واحد مثلًا، كمستخدم بمنشورات كثيرة:
مُزخرِفات العلاقات الأخرى @OneToOne() و@ManyToMany() (الأخيرة تُنشئ جدول وصل تلقائيًا).
تحميل العلاقات
لا تُحمَّل العلاقات افتراضيًا — تطلبها بخيار relations:
relations أو JOIN في باني الاستعلام) بدل التحميل الكسول داخل حلقة.
باني الاستعلام للاستعلامات المعقّدة
لأي شيء يتجاوز عمليات find البسيطة — الوصلات والتجميعات والمرشّحات الشرطية — استخدم باني الاستعلام:
:active)، لا دمج النصوص. يُمعلِم باني الاستعلام القيم، ما يمنع حقن SQL. بناء جملة WHERE بدمج مدخلات المستخدم ثغرة أمنية خطيرة.
الخلاصة
احقن Repository<Entity> بـ @InjectRepository() واستخدم create/save/find/update/delete لـ CRUD (تذكّر أنّ save() يُثبّت). عرّف العلاقات بـ @OneToMany/@ManyToOne/@ManyToMany، وحمّلها بخيار relations، وتجنّب استعلامات N+1. استخدم باني الاستعلام بمعاملات مربوطة للاستعلامات المعقّدة والآمنة. تاليًا: إدارة تغييرات المخطّط بالترحيلات.