من میخواستم برای اینکه صفحه ی مقالاتم بهینه تر بشه به جای get از Lazy استفاده کنم و مشکلی نداشت و همه چیز با paginate کردن کالکشن Lazy خوب کار میکرد.
حالا اومدم cache رو بهش اضافه کنم که هربار کوئری نزنم: این کدی بود که نوشته بودم
protected function getArticles(): LengthAwarePaginator
{
//if in trash can
$query = Article::with('media')->latest();
//make a lazy collection and paginate
return Help::paginate($query->lazy() , 20);
}
public function index()
{
//if we have cache //get cache //if not make cache
$articles = Cache::remember('articles' , config('cache.ttl' , 60 * 15) , function (){
return $this->getArticles();
});
}
اما مشکل اینجا بود که currentpage داخل cache رفته بود و وقتی تغییر صفحه میدادم هنوز فک میکرد صفحه 1 هستیم.
برای همین اینطوری paginate رو از cache خارج کردم:
protected function getArticles()
{
//if in trash can
$query = Article::with('media')->latest();
//make a lazy collection and paginate
return $query->lazy();
}
public function index()
{
//if we have cache //get cache //if not make cache
$articles = Cache::remember('articles' , config('cache.ttl' , 60 * 15) , function (){
return $this->getArticles();
});
Help::paginate($articles , 20);
}
حالا برای cache ارور میده :
Serialization of 'Closure' is not allowed
این مشکل در cache زمان put اتفاق میوفته.
از هوش مصنوعی کمک گرفتم گفت باید LazyCollection رو تبدیل به Collection کنی
نتیجه شد و جواب داد:
return collect($query->lazy());
اگه روش دیگه ای سراغ دارین یا تجربه ای دارید که مرتبط باشه ممنون میشم به اشتراک بذارین.
به احمدرضا نوزعیم کمک کنید تا مشکل خودش را حل کند؛ اینطور میتوانیم با هم پیشرفت کنیم.
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟