إيثار شروف

إيثار شروف

مطوّر ويب وتطبيقات

الإعدادات
الوضع الداكن

قائمة الأكواد

15 نتيجة

Eloquent

جلب مجموع السجلات عند إستخدام pagination

لجلب مجموع السجلات عند إستخدام pagination يجب تعيين المتغير sum قبل عمل pagination 

$query=Post::query();
$sum=$query->sum('post_views');
$posts=$query->paginate(10);

لأنة لو قمنا بعمل 

$query=Post::paginate(10);
$sum=$query->sum('post_views');

فإنه سيظهر المجموع فقط لكل صفحة.

21 يناير 2024 2,464 مشاهدة
Eloquent

جلب البيانات بشكل عشوائي في لارافيل

في بعض الحالات، نحتاج لجلب البيانات من قاعدة البيانات بترتيب عشوائي مختلف في كل مرة، بدلاً من الترتيب الافتراضي (حسب id أو تاريخ الإنشاء مثلاً). من الأمثلة الشائعة على ذلك: أنظمة الاختبارات الإلكترونية، حيث نريد أن يظهر للطالب سؤال مختلف في كل مرة، مع ظهور خيارات الإجابة بترتيب مختلف أيضًا في كل محاولة، لتقليل فرص الغش أو حفظ الترتيب.

توفّر Laravel لهذا الغرض دالة جاهزة وبسيطة وهي inRandomOrder.


الاستخدام الأساسي: ترتيب عشوائي لجدول واحد

لجلب جميع الأسئلة بترتيب عشوائي في كل مرة يتم فيها تنفيذ الاستعلام:

$questions = Question::inRandomOrder()->get();

في كل مرة يُنفَّذ فيها هذا الكود، سيختلف ترتيب النتائج المُرجعة تلقائيًا، دون الحاجة لأي منطق إضافي أو خلط يدوي للمصفوفة بعد جلب البيانات.


الترتيب العشوائي عبر علاقة (Relationship)

الحالة الأكثر فائدة عمليًا هي عند التعامل مع علاقة بين جدولين، مثل نظام امتحان يحتوي على أسئلة (Questions) وإجابات (Answers) لكل سؤال. الهدف هنا مضاعف: جلب الأسئلة بترتيب عشوائي، وفي نفس الوقت جلب إجابات كل سؤال بترتيب عشوائي أيضًا.

لتحقيق ذلك، نستخدم inRandomOrder داخل تعريف العلاقة نفسها ضمن with:

$questions = Question::with(['answers' => function ($q) {
    $q->inRandomOrder();
}])->inRandomOrder()->get();

توضيح

  • inRandomOrder() الأولى (المطبقة مباشرة على Question) تُرتّب الأسئلة نفسها بشكل عشوائي.
  • inRandomOrder() الثانية (داخل Closure الخاصة بـ answers) تُرتّب إجابات كل سؤال بشكل عشوائي مستقل.
  • لاحظ أن الـ Closure يجب أن تستقبل المتغير $q كوسيط صريح (function ($q))، وليس بدون وسيط، وإلا سيصبح $q غير معرَّف داخل الدالة ويؤدي ذلك إلى خطأ عند التنفيذ.

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


ملاحظة حول الأداء

تعتمد inRandomOrder داخليًا على دالة ترتيب عشوائي في قاعدة البيانات (مثل ORDER BY RAND() في MySQL). هذه الطريقة تعمل بشكل ممتاز مع الجداول الصغيرة والمتوسطة، لكنها قد تصبح أبطأ نسبيًا مع الجداول الكبيرة جدًا (بعشرات أو مئات الآلاف من السجلات)، لأن قاعدة البيانات تحتاج لحساب قيمة عشوائية لكل صف قبل الترتيب. في حال كان الجدول ضخمًا وظهر تأثير ملحوظ على الأداء، يمكن اللجوء لحلول بديلة مثل الترتيب العشوائي على مستوى التطبيق بعد تحديد نطاق (LIMIT) أصغر من البيانات.

21 يناير 2024 2,564 مشاهدة
Eloquent

عمل تعديل مباشرة دون عمل تحميل البيانات من قاعدة البيانات

في eloquent، تستطيع عمل تعديل على حقول قواعد البيانات مباشرة دون تحميل البيانات

Cat::where('id',$id)->update(['title' => "Updated Title"]);
21 يناير 2024 2,336 مشاهدة
Eloquent

عمل filter إضافي عند عمل إستعلام بالعلاقات

اذا أردنا أن نجلب بيانات من الجدول الأب مع بيانات من جدول الإبن، نستطيع عمل محددات او ترتيب داخل الدالة، على سبيل المثال، إذا أردنا أن نجلب الدول مع أكبر 3 مدن 

$countries = Country::with(['cities' => function($query) {
    $query->orderBy('population', 'desc');
    $query->take(3);
}])->get();
21 يناير 2024 2,095 مشاهدة
Eloquent

إستخدام withCount لحساب عدد الحقول الأبناء

إذا كان لدينا علاقة hasMany ونريد إظهار الجدول الأب مع عدد الأبناء، لا يجب كتابة جملة إستعلام أخرى، مثلا اذا كان لدينا جدول الأقسام cats ونريد إستخراج أسماء الأقسام مع عدد المنتجات في كل قسم

public function index(){
    $cat=Cat::select('id','title')->withCount('product')->get();
    return $catt;
}

النتيجة تكون كما يلي

{
   "id": 3,
   "title": "Computer, Office & Security",
   "product_count": 2
},
{
    "id": 4,
    "title": "Bags & Shoes",
    "product_count": 2
}

كما تمرير مصفوفة من الحقول الى withCount

Cat::select('id','title')->withCount(['product','comments'])->get();

كما نستطيع عمل ترتيب حسب عدد الأبناء (المنتجات)

Cat::withCount('product')->orderBy('product_count', 'desc')->get();
21 يناير 2024 2,597 مشاهدة
Eloquent

hasMany ، تحديد عدد السجلات

بإستخدام العلاقة hasMany، نستطيع عمل فلترة للسجلات التي تحتوي على عدد X من الأبناء

// Author -> hasMany(Book::class)
$authors = Author::has('books', '>', 5)->get();
21 يناير 2024 2,403 مشاهدة
Eloquent

إستخدام DB transactions

اذا كنا نتعامل مع علمية إدخال لجدولين، ربما يحصل خطأ أثناء إدخال البيانات للجدول الثاني، بالتالي يجب عمل تراجع عن البيانات المدخلة للجدول الأول، لذلك ينصح بإستخدام Transactions

DB::transaction(function () {
    DB::table('users')->update(['votes' => 1]);
    DB::table('posts')->delete();
});

للمزيد من هنا

21 يناير 2024 2,966 مشاهدة
Eloquent

إخفاء بعض الحقول في eloquent

عند عمل إستعلام بإستخدام eloquent إذا كنا نريد إخفاء بعض الحقول من النتائج، ببساطه يمكن إضافة makeHidden

Snippet::all()->makeHidden(['created_at', 'updated_at']);
21 يناير 2024 2,649 مشاهدة
Eloquent

البحث حسب التاريخ في laravel

عند جلب البيانات حسب جدول التاريخ بدلا من إستخدام 

User::orderBy('created_at', 'desc')->get();

نستطيع عمل ذلك بشكل أسرع، ويتم الترتيب بشكل desc

User::latest()->get();

بالوضع الإفتراضي latest تقوم بالترتيب حسب حقل created_at

اذا كنا نريد الترتيب بشكل ascending يمكن إستخدام oldest

User::oldest()->get();

كما نستطيع تغيير جدول البحث الإفتراضي من created_at الى updated_at

$lastUpdatedUser = User::latest('updated_at')->first();
21 يناير 2024 2,976 مشاهدة
Eloquent

البحث في laravel بإستخدام firstOrFail

 بالإضافة إلى findOrFail، يوجد دالة firstOrFail حيث تقوم بإرجاع صفحة 404 اذا لم يكن هناك نتائج للبحث

$user = User::where('email', ccc@ccc.com')->firstOrFail();
21 يناير 2024 2,788 مشاهدة
Eloquent

إستخدام dd بشكل أسرع

عوضا عن إستخدام dd($result)  بالإمكان وضع ->dd() كـ method مباشرة في نهاية جملة query او collection

// Instead of
$users = User::where('name', 'Ethar')->get();
dd($users);
// Do this
$users = User::where('name', 'Ethar')->get()->dd();
21 يناير 2024 2,737 مشاهدة
Eloquent

الترقيم المبسط للصفحات simplePagination

في ترقيم الصفحات pagination إذا كنا نريد فقط next/previous عوضا عن الأرقام، فقط نستبدل paginate بـ simplePaginate، كما أن هذه الطريقة تخفف حمل على قاعدة البيانات fewer DB queries

// Instead of 
$users = User::paginate(10);
// You can do this
$users = User::simplePaginate(10);
21 يناير 2024 2,619 مشاهدة