🎉 سال نو، مهارت نو، مشاوره رایگان نقشه راه برنامه نویسی (آفر ویژه ثبت نام قبل از افزایش قیمت 🔥)
۰ ثانیه
۰ دقیقه
۰ ساعت
۲ پویا پارسایی
بهترین روش paginate برای تعداد زیاد رکوردها
جامعه لاراول ایجاد شده در ۲۲ اردیبهشت ۱۴۰۱

سلام و عرض ادب

همونجور که میدونید زمانیکه تعداد رکوردامون زیاده، وقتی از paginate استفاده میکنیم، چون میخواد count اون تیبل رو بگیره، زمان زیادی میبره که جواب رو بگیریم. به طور مثال توی ۲ میلیون رکورد شاید ۶ ثانیه طول بکشه.

لاراول یه متدی داره به اسم ()simplePaginate که دیگه این count رو نمیگیره و فقط صفحات قبلی و بعدی رو نمایش میده که خب خیلی هم خوبه.

ولی مشکل جایی هست که وقتی میخوایم از یک سری پکیج استفاده کنیم دیگه نمیتونیم از این simplePaginate استفاده کنیم. به طور مثال پکیج laravel datatables.

توی این پکیج ما یه کوئری بیلدر میسازیم و بهش میدیم، خودش دیگه هم paginate میکنه، هم رندر میکنه و ... .

البته این پکیج خودش یه قابلیت داره به اسم getManualCount که به صورت دستی تعداد رو میگیره، و دیگه واسه گرفتن تعداد رکوردها جهت paginate کردن، کوئری نمیزنه به دیتابیس. به طور مثال:

 return Datatables::of($users)
                ->setTotalRecords(100)
                ->make(true);

حالا توی لاراول ما چطوری میتونیم این تعداد رکورد رو به صورت داینامیک بهش بدیم که خودمون هم نیاز نباشه به دیتابیس کوئری بزنیم؟

البته با کش هم پیاده سازیش کردم، که بعد توی فیلتر و جستجو یه سری مشکلات بوجود میاره که البته اونم باز با یه سری کارا توی تنظیمات دیتاتیبل میشه حلش کرد.

ولی من فکر میکنم راه حل بهینه ای نیست و باید راه بهتری باشه.

پویا پارسایی ۲۲ اردیبهشت ۱۴۰۱، ۱۵:۱۶

سلام.

کش روش درستیه و کلید کش رو میتونی به این شکل بسازی:

md5(serialize($_GET).serialize($_POST))

تا اگر url تغییر کرد دیتا بروز بشه.

به کش هم تگ بده و توی مدیریت هروقت چیزی بروز شد، کش‌های مرتبط با اون تگ رو حذف کنه.

یه راه دیگم استفاده از یک جدول داخل دیتابیس هست که با یک trigger این جدول آپدیت بشه. ولی همون کش راه مناسبیه.

بهترین پاسخ
محسن موحد ۲۳ اردیبهشت ۱۴۰۱، ۱۵:۱۷