علي العبدالله نشر 28 أبريل 2023 أرسل تقرير نشر 28 أبريل 2023 لدي موقع جدول الستخدمين وجدول التقييمات قمت بربطهم بعلاقة 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() ؟ 2 اقتباس
0 سمير عبود نشر 29 أبريل 2023 أرسل تقرير نشر 29 أبريل 2023 يُمكنك إستخدام التابع 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(); 1 اقتباس
0 Mustafa Suleiman نشر 28 أبريل 2023 أرسل تقرير نشر 28 أبريل 2023 من خلال الدالة orderBy() في Laravel لترتيب البيانات تصاعديًا أو تنازليًا وفقًا لنتائج الدالة average() التي تم إنشاؤها، وتستطيع تحقيق ذلك بسهولة عن طريق إضافة السطر التالي إلى استعلام قاعدة البيانات الخاص بك: $users = User::withCount('ratings')->orderByDesc('ratings_count')->get(); وتستخدم withCount() لحساب عدد التقييمات لكل مستخدم ، و orderByDesc() لترتيب النتائج بترتيب تنازلي وفقًا لعدد التقييمات. بالتالي، سيكون أولئك الذين لديهم المزيد من التقييمات في الأعلى وسيتم ترتيبهم بشكل تنازلي. وإذا كنت تريد ترتيبهم تصاعديًا ، فتستطيع استخدام orderBy() بدلاً من orderByDesc(). $users = User::withCount('ratings')->orderBy('ratings_count')->get(); وتأكد من استبدال ratings بالاسم الصحيح للعلاقة بين الجدولين في نموذج المستخدم الخاص بك. 1 اقتباس
0 علي العبدالله نشر 28 أبريل 2023 الكاتب أرسل تقرير نشر 28 أبريل 2023 بتاريخ 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 Mustafa Suleiman نشر 28 أبريل 2023 أرسل تقرير نشر 28 أبريل 2023 في حال أنك تريد ترتيب النتائج حسب المتوسط الأعلى، فتستطيع تحديث الاستعلام لاستخدام الدالة orderByDesc() على نتائج الدالة average() بدلاً من عدد التقييمات. $users = User::with('ratings') ->withCount('ratings') ->orderByDesc(function ($user) { return $user->ratings->avg('stars'); }) ->get(); تستخدم الدالة avg() هنا لحساب المتوسط عن طريق الاستعانة بالعلاقة ratings في نموذج المستخدم. ثم الإعتماد على orderByDesc() لترتيب النتائج بترتيب تنازلي وفقًا لنتائج الدالة avg() للتقييمات. بهذه الطريقة ، ستظهر النتائج بترتيب تنازلي وفقًا للمتوسط الأعلى لتقييمات المستخدمين. لاحظ أني قمت بإضافة with('ratings') لجلب بيانات التقييمات مع كل مستخدم ، ولذلك يجب التأكد من استخدام الاسم الصحيح للعلاقة بين الجدولين في نموذج المستخدم الخاص بك. 1 اقتباس
0 علي العبدالله نشر 28 أبريل 2023 الكاتب أرسل تقرير نشر 28 أبريل 2023 بتاريخ 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 Mustafa Suleiman نشر 28 أبريل 2023 أرسل تقرير نشر 28 أبريل 2023 حاول استخدام الدالة withCount() بدلاً من الدالة with() للعلاقة ratings. $users = User::withCount('ratings') ->orderByDesc(function ($user) { return $user->ratings->avg('stars'); }) ->get(); اقتباس
0 علي العبدالله نشر 28 أبريل 2023 الكاتب أرسل تقرير نشر 28 أبريل 2023 بتاريخ 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 اقتباس
السؤال
علي العبدالله
لدي موقع جدول الستخدمين وجدول التقييمات
قمت بربطهم بعلاقة one to many
ولدي دالة لإحضار المتوسط
User.php
كيف اقوم بترتيب الusers عن طريق ال average() ؟
7 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.