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

السؤال

نشر

لدي موقع جدول الستخدمين وجدول التقييمات

 قمت بربطهم بعلاقة one to many

ولدي دالة لإحضار المتوسط

 

User.php

    public function average()
    {
        $stars = 0;
        foreach ($this->ratings as $key) {
            $stars += $key->stars;
        }

        return $stars == 0 ? 0 :
            round($stars / count($this->ratings));
    }

 

كيف اقوم بترتيب الusers عن طريق ال average() ؟

Recommended Posts

  • 0
نشر

من خلال الدالة orderBy() في Laravel لترتيب البيانات تصاعديًا أو تنازليًا وفقًا لنتائج الدالة average() التي تم إنشاؤها، وتستطيع تحقيق ذلك بسهولة عن طريق إضافة السطر التالي إلى استعلام قاعدة البيانات الخاص بك:

$users = User::withCount('ratings')->orderByDesc('ratings_count')->get();

وتستخدم withCount() لحساب عدد التقييمات لكل مستخدم ، و orderByDesc() لترتيب النتائج بترتيب تنازلي وفقًا لعدد التقييمات.

بالتالي، سيكون أولئك الذين لديهم المزيد من التقييمات في الأعلى وسيتم ترتيبهم بشكل تنازلي.

وإذا كنت تريد ترتيبهم تصاعديًا ، فتستطيع استخدام orderBy() بدلاً من orderByDesc().

$users = User::withCount('ratings')->orderBy('ratings_count')->get();

وتأكد من استبدال ratings بالاسم الصحيح للعلاقة بين الجدولين في نموذج المستخدم الخاص بك.

  • 0
نشر
بتاريخ 15 دقائق مضت قال Mustafa Suleiman:

من خلال الدالة orderBy() في Laravel لترتيب البيانات تصاعديًا أو تنازليًا وفقًا لنتائج الدالة average() التي تم إنشاؤها، وتستطيع تحقيق ذلك بسهولة عن طريق إضافة السطر التالي إلى استعلام قاعدة البيانات الخاص بك:

$users = User::withCount('ratings')->orderByDesc('ratings_count')->get();

وتستخدم withCount() لحساب عدد التقييمات لكل مستخدم ، و orderByDesc() لترتيب النتائج بترتيب تنازلي وفقًا لعدد التقييمات.

بالتالي، سيكون أولئك الذين لديهم المزيد من التقييمات في الأعلى وسيتم ترتيبهم بشكل تنازلي.

وإذا كنت تريد ترتيبهم تصاعديًا ، فتستطيع استخدام orderBy() بدلاً من orderByDesc().

$users = User::withCount('ratings')->orderBy('ratings_count')->get();

وتأكد من استبدال ratings بالاسم الصحيح للعلاقة بين الجدولين في نموذج المستخدم الخاص بك.

لقد قام بترتيبهم حسب الاكثر تقييماً وليس الاعلى تقييماً

لدي مستخدم تم تقييمه من قبل عميلين لكل العميل الاول 3 والعميل الثاني 5 

المجموع 8

8 على 2 = 4

 

ولدي مستخدم اخر تم تقييمه من قبل عميل واحد ب 5 نجوم

المجموع 5 

5 على 1 = 5

 

صاحب المتوسط 4 يظهر اولاً ثم صاحب المتوسط 5 

 

اريد ان يظهر المتوسط الاعلى وهو 5 

كيف ذلك

  • 0
نشر

في حال أنك تريد ترتيب النتائج حسب المتوسط الأعلى، فتستطيع تحديث الاستعلام  لاستخدام الدالة orderByDesc() على نتائج الدالة average() بدلاً من عدد التقييمات.

$users = User::with('ratings')
    ->withCount('ratings')
    ->orderByDesc(function ($user) {
        return $user->ratings->avg('stars');
    })
    ->get();

تستخدم الدالة avg() هنا لحساب المتوسط عن طريق الاستعانة بالعلاقة ratings في نموذج المستخدم.

ثم الإعتماد على  orderByDesc() لترتيب النتائج بترتيب تنازلي وفقًا لنتائج الدالة avg() للتقييمات. بهذه الطريقة ، ستظهر النتائج بترتيب تنازلي وفقًا للمتوسط الأعلى لتقييمات المستخدمين.

لاحظ أني قمت بإضافة with('ratings') لجلب بيانات التقييمات مع كل مستخدم ، ولذلك يجب التأكد من استخدام الاسم الصحيح للعلاقة بين الجدولين في نموذج المستخدم الخاص بك.

  • 0
نشر
بتاريخ 17 دقائق مضت قال Mustafa Suleiman:

في حال أنك تريد ترتيب النتائج حسب المتوسط الأعلى، فتستطيع تحديث الاستعلام  لاستخدام الدالة orderByDesc() على نتائج الدالة average() بدلاً من عدد التقييمات.

$users = User::with('ratings')
    ->withCount('ratings')
    ->orderByDesc(function ($user) {
        return $user->ratings->avg('stars');
    })
    ->get();

تستخدم الدالة avg() هنا لحساب المتوسط عن طريق الاستعانة بالعلاقة ratings في نموذج المستخدم.

ثم الإعتماد على  orderByDesc() لترتيب النتائج بترتيب تنازلي وفقًا لنتائج الدالة avg() للتقييمات. بهذه الطريقة ، ستظهر النتائج بترتيب تنازلي وفقًا للمتوسط الأعلى لتقييمات المستخدمين.

لاحظ أني قمت بإضافة with('ratings') لجلب بيانات التقييمات مع كل مستخدم ، ولذلك يجب التأكد من استخدام الاسم الصحيح للعلاقة بين الجدولين في نموذج المستخدم الخاص بك.

يظهر الخطأ

Undefined property: Illuminate\Database\Query\Builder::$ratings

  • 0
نشر
بتاريخ 2 دقائق مضت قال Mustafa Suleiman:

حاول استخدام الدالة withCount() بدلاً من الدالة with() للعلاقة ratings.

$users = User::withCount('ratings')
    ->orderByDesc(function ($user) {
        return $user->ratings->avg('stars');
    })
    ->get();

 

تظهر المشكلة

return $user->ratings->avg('stars');

 

المشكلة من $user حيث لايوجد بداخله بيانات اغلبه null

  • 0
نشر

يُمكنك إستخدام التابع withAvg كما هو الحال مع withCount او withMax و غيرها، تحتاج فقط أن تمرر إسم العلاقة كمعامل أول و إسم العمود الذي تريد أن تحسب المتوسط من خلاله (أعتقد أن إسم العلاقة لديك هو ratings و إسم العمود stars) بالشكل التالي:

$users = User::withAvg('ratings', 'stars')->get();

سيظهر لك مع بيانات المستخدم متوسط التقييمات إسم المفتاح سيكون مكون من إسم العلاقة و إسم العمود بينهما avg بالشكل: ratings_avg_stars يمكنك من خلاله.

يمكنك بعد ذلك إستخدام التابع orderBy أو orderByDesc لترتيب البيانات تصاعدياً او تنازلياً حسب المعدل كما يلي:

$users = User::withAvg('ratings', 'stars')->orderBy('ratings_avg_stars')->get();

$users = User::withAvg('ratings', 'stars')->orderByDesc('ratings_avg_stars')->get();

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...