حيل لعلاقات Laravel Eloquent

إحدى نقاط قوة Laravel هي تركيبها الأنيق. إذا كان لديك الكثير من النماذج والعلاقات في Laravel (بسبب وجود الكثير من الجداول في قاعدة البيانات)، فقد ينتهي الاجتياز غالبًا بكود برمجي أقل أناقة. مع مرور الوقت، أثبتت ثلاث ملحقات صغيرة نجاحها بالنسبة لي، والتي أود أن أعرضها بإيجاز أدناه. للقيام بذلك نستخدم فقط بعض الميراث والأساليب السحرية والمجموعات المخصصة.


أولاً ، نقوم بإنشاء نموذج جديد ضمن app \ ConvenienceModel.php:

b45e29b9125c2ab565b5526442437686

ثم تركنا جميع النماذج ترث من نموذجنا الجديد ConvenienceModel:

b45e29b9125c2ab565b5526442437686

امزج وظائفك مع العلاقات

إذا كنت ترغب في الحصول على نماذج متصلة ، يمكنك استخدام البنية القياسية للاتصال بها:

b45e29b9125c2ab565b5526442437686

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

b45e29b9125c2ab565b5526442437686

نريد توحيد بناء الجملة لكلا المتغيرين. للقيام بذلك ، نضيف الطريقة السحرية __call إلى ConvenienceModel:

b45e29b9125c2ab565b5526442437686

هذه المكالمة ممكنة أيضًا في المثال أعلاه:

b45e29b9125c2ab565b5526442437686

تحقق من الأشياء الفارغة

إذا كنت ترغب في عرض اسم البلد لعنوان شخص ما، فغالبًا ما سترى الكود التالي:

b45e29b9125c2ab565b5526442437686

ولمنع ذلك، نقوم بتضمين مكتبة stringhelper ونعيد كائنًا خاصًا من الفئة الفارغة `empty` إذا لم يتم العثور على نموذج.:

b45e29b9125c2ab565b5526442437686

وهذا يعني أن المكالمة ناجحة (في هذا المثال، إذا تم العثور على شيء ما، فسيتم إخراج اسم البلد، وفي جميع الحالات الأخرى سلسلة فارغة):

b45e29b9125c2ab565b5526442437686

إذا أردنا أيضًا تغطية الحالة التي قد لا يكون فيها المستخدم برقم التعريف 42 موجودًا ، فسنبني أيضًا وظيفة مساعدة صغيرة لهذا الغرض:

b45e29b9125c2ab565b5526442437686

وبالتالي فإن الاستدعاء التالي يسلم سلسلة فارغة حتى لو لم يكن المستخدم موجودًا على الإطلاق:

b45e29b9125c2ab565b5526442437686

اجتياز علاقات n: m بسهولة

أخيرًا ، نريد تبسيط الكود التالي:

b45e29b9125c2ab565b5526442437686

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

b45e29b9125c2ab565b5526442437686

بعد ذلك، نقوم بإنشاء الملف app\Helpers\ConvenienceCollection.php ، والذي يضمن أنه عند استدعاء وظائف غير معروفة في المجموعات، يتم تنفيذ الوظيفة لجميع العناصر الموجودة في المجموعة.:

b45e29b9125c2ab565b5526442437686

لذلك يمكننا استخدام الكود التالي لإخراج جميع أسماء جميع البلدان من جميع عناوين جميع أولياء أمور الشخص:

b45e29b9125c2ab565b5526442437686

لكن من الممكن أيضًا إجراء مكالمات مثل ما يلي:

b45e29b9125c2ab565b5526442437686

فرز حسب عدة أعمدة

يقوم الأمر التالي بالفرز حسب الموقع فقط، على الرغم من أن هذه النتيجة ربما لم تكن المقصودة.:

b45e29b9125c2ab565b5526442437686

لتمكين الفرز وفقًا لعدة أعمدة ، نقوم بتوسيع مجموعة ConvenienceCollection الخاصة بنا:

b45e29b9125c2ab565b5526442437686

مع ذلك يمكننا فرز المجموعة وفقًا لعدة أعمدة:

b45e29b9125c2ab565b5526442437686

الفرز القياسي

نحن نعمل على توسيع مجموعة ConvenienceCollection بوظيفة مساعدة أخرى:

b45e29b9125c2ab565b5526442437686

الآن يمكنك إعطاء كل نموذج وظيفة فرز قياسية فردية:

b45e29b9125c2ab565b5526442437686

مع هذا يمكننا فرز مجموعة مع:

b45e29b9125c2ab565b5526442437686

أسماء الكائنات

يطبق كل نموذج طريقة getLabel (يختلف getName وفقًا للطراز):

b45e29b9125c2ab565b5526442437686

باستخدام هذا يمكنك عرض اسم الكائن بسرعة وسهولة. يمكنك بعد ذلك تنفيذ التابع sortByLabel المساعد في ConvenienceCollection:

b45e29b9125c2ab565b5526442437686

نتائج فارغة

إذا كانت الخطوة الوسيطة فارغة ، فإن دالات Laravel أولاً () والأخير () تعيد الصفر عادةً. لذلك نقدم getFirst () و getLast () حتى تنجح المكالمة التالية دائمًا:

b45e29b9125c2ab565b5526442437686

بهذا نعيد مساعد __empty_ الذي يتعرف عليه __x:

b45e29b9125c2ab565b5526442437686

عودة