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

ترتيب البيانات تصاعدياً او تنازلياً من خلال العلاقة Laravel

علي العبدالله

السؤال

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

 قمت بربطهم بعلاقة 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

يُمكنك إستخدام التابع 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();
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 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

رابط هذا التعليق
شارك على الشبكات الإجتماعية

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...