اذهب إلى المحتوى

السؤال

نشر

أريد الحصول على قائمة بكل المستخدمين المسجلين في الموقع ماعدا المستخدم الحالي (الذي يشاهد الصفحة وقام بتسجيل الدخول)، أعلم أنه يمكنني الحصول على كل المستخدم من خلال الكود التالي:

User::all();

ولكن كيف أقوم بتحديد كل المستخدمين ماعدا مستخدم معين وليكن المستخدم الحالي (الذي قام بتسجيل الدخول إلى الموقع) على سبيل المثال؟

Recommended Posts

  • 2
نشر

يمكننا عمل الاستعلام بمساعدة دالة الاستثناء except ونمرر لها معرف المستخدم الحالي مثلا من الصنف Auth ليصبح كالتالي:

<?php

$users = User::all()->except(Auth::id());

كما يوجد طرق أخرى مثل عمل إحدى الطريقتين:

  • نستعمل الدالة where ونمرر لها معاملات الشرط المناسبة مثل اسم العمود id و الشرط لا يساوي ثم رقم المستخدم الحالي
<?php

$users = User::where('id', '!=', auth()->id())->get();

$users = User::whereKeyNot(auth()->id)->get();

وفي حال أردت استثناء أكثر من مستخدم يمكنك تمرير مصفوفة بال ids للدالة except

<?php

User::all()->except([1,2,3,4]);

 

  • 2
نشر

بالاضافة الى اجابة المدرب وائل، يمكنك اعادة تعريف او تجاوز overriding التابع all بما يوافق مرادك. كأن تستثني معرفا أو مستخدما ما بشكل عام دون الحاجة لإعادة استثناءه كل مرة. 

يشترط أثناء تجاوز اي تابع او وظيفة في لارافيل تعريفها وفق ما هي معرفة في صنفها الحاوي لها. 

اعادة تعريف التابع all بما يوافقنا سيكون في ملف النموذج User.php كالتالي: 

    /**
    * اصتثناء مستخدمين معينين
    *
    * @param  array|mixed  $keys
    * @return array
    */
    public static function all($keys = null)
    {
        $data = parent::all(); # حقن البيانات من صنف النموذج في متغير

        return $data->except(auth()->id); # استثناء المستخدم القائم بالطلب
    }

ثم سيمكنك بأي مكان من تطبيقك استدعاء التابع all بالطريقة التقليدية التي تعرفها: 

User::all() # ستقوم بإعادة كامل المستخدمين معدا المحدد لها

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

ميزة اطر العمل مفتوحة المصدر هي في مرونتها ولامحدوديتها، يمكنك تخصيص اي جزء من التطبيق وفق منطق الخاص. 

  • 2
نشر

أحد الخيارات المطروحة إضافةً لأجوبة المُدربين هو إستخدام نطاقات الإستعلام الخاصة   نُضيف التالي إلى نموذج المُستخدم User:

public function scopeAllWithoutCurrent($query) {
  return $query->where('id', '!=', auth()->id());
}

إسم النطاق راجع للمُطور أهم شيء يجب أن يبدأ بكلمة scope و عندما تُريد جلب المُستخدمين تستخدم التابع allWithoutCurrent بالشكل:

User::allWithoutCurrent()->get()->dd();

تستطيع بعد إستدعاء التابع allWithoutCurrent أو قبله إستدعاء توابع Eloquent أو توابع لنطاقات إستعلام أنشأتها مُسبقاً مثلما ترغب، لمعلومات أكثر: Local Scopes

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

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...