جشنواره بهارانه راکت! ۳۵% تخفیف ویژه بر روی دوره‌های آموزشی

مشاهده دوره‌ها
ثانیه
دقیقه
ساعت
روز
کیان
2 سال پیش توسط کیان مطرح شد
23 پاسخ

مشکل در استفاده همزمان از withCount و cursorPaginate در لاراول

سلام به همه دوستان و اساتید عزیز
من در استفاده همزمان از withCount و orderBy و cursorPaginate به مشکل خوردم
در واقع میخوام لیست پروفایل هام رو برگردونم ولی بر اساس تعداد فالورهاشون از زیاد به کم پس کوئری ام رو اینطوری نوشتم

        $profile = Profile::with('user:id,photo')
            ->withCount('followers')
            ->where('verify', '=', 1)
            ->orderBy('followers_count', 'desc')
            ->cursorPaginate(20);

اما متاسفانه خطای زیر رو میده :

Column not found: 1054 Unknown column 'followers_count' in 'where clause'

خب امتحان کردم 20 تای اول رو برمیگردونه اما وقتی cursor درست میشه و میخوام 20 تای بعد رو برگردونم خطای بالا رو میده و انگار ستون followers_count رو پیدا نمیکنه

جالب اینکه از paginate استفاده میکنم کار میکنه اما وقتی از cursorPaginate استفاده میکنم این خطا رو میده
دلیل استفاده از cursor هم که دیگه فکر کنم مشخص هست و نیاز به توضیح نیست

ممنون میشم اگر بشه راهنمایی کنید هر چی سرچ کردم به نتیجه نرسیدم
سپاس


ثبت پرسش جدید
کیان
تخصص : ندارم ...
@kian.myphone 2 سال پیش مطرح شد
1

با کمی تاخیر خواستم راه حل مشکل بوجود اومده رو اینجا بنویسم شاید بعدا به کار کسی بیاد
از اونجایی که پس از پرسش و پاسخ های زیاد به نتیجه خاصی نرسیدم با لینکی که دوستمون معرفی کرد البته راهکاری برای این موضوع به صورت مستقیم نداشت اما در کل ممنونم چون با استفاده ازش یه ایده به ذهنم رسید
برای حل این مشکل اگر بشه دیتابیس رو به نوعی به فرض (( فریز )) کنیم که در واقع بگیم تا این time داده ها رو برای من کش کن مشکل در واقع حل میشد پس :

  if ($request->time != null){
            $time = $request->time;
            $profile = Profile::withCount(['followers' => function ($query) use ($time) {
                    $query->where('created_at', '<', $time);
                }])
                ->orderBy('followers_count', 'desc')
                ->orderBy('id', 'ASC')
                ->paginate(20);
        } else {
            $time = Carbon::now()->toDateTimeString();
            $profile = Profile::withCount('followers')
                ->orderBy('followers_count', 'desc')
                ->orderBy('id', 'ASC')
                ->paginate(20);
        }

طبق این کد بار اول همزمان با گرفتن داده ها time رو هم کش میکنیم و میگیم که تا این time من داده ها رو کش کردم و برای page های بعد اون time گرفته شده رو هم ارسال میکنیم و یه شرط اضافه میکنیم که داده هایی رو میخوایم که قبل از این time باشه
اینطوری کوچکترین اتفاقاتی هم اگر توی دیتابیس بیفته چه اضافه شدن رکورد چه کم شدن و ... دیگه لحاظ نمیشه و مشکل با همون paginate ساده هم حل میشه

در پایان از همه دوستانی که وقت گذاشتند و راهنمایی کردند ممنونم


کیان
تخصص : ندارم ...
@kian.myphone 2 سال پیش آپدیت شد
رایموند
تخصص : مختصص وردپرس - برنامه نویس لار...
@Raymond 2 سال پیش مطرح شد
کیان
تخصص : ندارم ...
@kian.myphone 2 سال پیش مطرح شد
1

با کمی تاخیر خواستم راه حل مشکل بوجود اومده رو اینجا بنویسم شاید بعدا به کار کسی بیاد
از اونجایی که پس از پرسش و پاسخ های زیاد به نتیجه خاصی نرسیدم با لینکی که دوستمون معرفی کرد البته راهکاری برای این موضوع به صورت مستقیم نداشت اما در کل ممنونم چون با استفاده ازش یه ایده به ذهنم رسید
برای حل این مشکل اگر بشه دیتابیس رو به نوعی به فرض (( فریز )) کنیم که در واقع بگیم تا این time داده ها رو برای من کش کن مشکل در واقع حل میشد پس :

  if ($request->time != null){
            $time = $request->time;
            $profile = Profile::withCount(['followers' => function ($query) use ($time) {
                    $query->where('created_at', '<', $time);
                }])
                ->orderBy('followers_count', 'desc')
                ->orderBy('id', 'ASC')
                ->paginate(20);
        } else {
            $time = Carbon::now()->toDateTimeString();
            $profile = Profile::withCount('followers')
                ->orderBy('followers_count', 'desc')
                ->orderBy('id', 'ASC')
                ->paginate(20);
        }

طبق این کد بار اول همزمان با گرفتن داده ها time رو هم کش میکنیم و میگیم که تا این time من داده ها رو کش کردم و برای page های بعد اون time گرفته شده رو هم ارسال میکنیم و یه شرط اضافه میکنیم که داده هایی رو میخوایم که قبل از این time باشه
اینطوری کوچکترین اتفاقاتی هم اگر توی دیتابیس بیفته چه اضافه شدن رکورد چه کم شدن و ... دیگه لحاظ نمیشه و مشکل با همون paginate ساده هم حل میشه

در پایان از همه دوستانی که وقت گذاشتند و راهنمایی کردند ممنونم


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام