راکت
حل شده

حذف row های قدیمی یک تیبل بر حسب تعداد row ها

8 پاسخ

سلام دوستان
بنده مدتی هست که نیاز دارم تا row های قدیمی تر یک تیبل از دیتابیسم بر حسب تعداد حذف بشه !
مثلا تعداد row ها که از 20 تا بیشتر شد قدیمی تر ها حذف بشن!

چه کد یا راهی رو پیشنهاد میدین !؟

ثبت پرسش جدید

پاسخ‌ها

8
علی بیات
علی بیات
@ali.bayat

تخصص: توسعه دهنده ارشد وب

بهترین پاسخ

یه فیلد به جدول اضافه کنید مثلا user_id
یه رابطه هم بین مثلا Post و User بوجود بیارید
و ازش به شکل زیر استفاده کنید

$latest_posts_ids = auth()->user()->posts()->latest()->take(20)->pluck('id')->toArray();

بعد میتونی حین حذف سطرها، یه شرط تعریف کنی که فقط post های همون User ، اضافه هاش پاک بشه


DB::table('posts')
            ->where('user_id', '=', auth()->user()->id)
            ->where(function ($query) {
                $query->whereNotIn('id', $latest_posts_ids);
            })
            ->delete();
علی بیات
علی بیات
@ali.bayat

تخصص: توسعه دهنده ارشد وب

نمیدونم الکوئنت برای این کار متد خاصی داشته باشه یا نه..

اما میتونی ۲۰ تا رکورد آخر رو بگیری:

$posts = Post::latest()->take(20)->get();

بعد جدولت رو خالی کنی:

DB::table('posts')->truncate();

سپس با استفاده از یه حلقه foreach داده ها رو پیمایش کنی و وارد دیتابیس کنی:

foreach ($posts as $post) 
{
    Post::create($post->toArray());
}

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

حسام
حسام
@rebel

تخصص: میکروکنترلرها و الکترونیک دیجیتال

مرسی @ali.bayat محبت کردین..

ولی باید راه بهتر و سریعتری و سبک تری باشه !!!!
و خیلی تعجب میکنم!! چوت این مبحث میتونه خیلی کاربردی باشه و بحث خیلی کمی پیرامونش شده!!!!!

دیتاهای من به صورت مداوم با فاصله زمانی حداقل 5 دقیقه و در طول ماه ها میخوان به سرور ارسال بشن! باید یه راهی باشه که سبک تر باشه.

delete  from table_name where ID not in(
select top 200 ID from table_name order by id desc
);

نظرتون برای این کوئری چیه؟!
هنوز تستش نکردم
(این row ها برای هر یوزر جدان)

شاید پاسخ شما همین‌جا باشد

علی بیات
علی بیات
@ali.bayat

تخصص: توسعه دهنده ارشد وب

بله این راه هم شدنی به نظر میرسه..

من سعی کردم در قالب کار با الکوئنت، پاسخی به سوال شما بدم... وگرنه هر زمان لازم باشه میتونیم از کوئری های raw هم استفاده کنیم و خلاص.


یه کار دیگه هم که میشه انجام داد:

با الکوئنت آی دی ۲۰ پست آخر رو در یک آرایه ذخیره کنید:

$latest_posts_ids = Post::latest()->take(20)->pluck('id')->toArray();

بعد با کوئری بیلدر و متد whereNotIn بقیه سطر هارو حذف کنید:

DB::table('posts')
    ->whereNotIn('id', $latest_posts_ids)
    ->delete();
حسام
حسام
@rebel

تخصص: میکروکنترلرها و الکترونیک دیجیتال

@ali.bayat
بینهایت تشکر از محبتتون
یه مسئله دیگه این بود که هر رکورد مناسب یه یوزر آی دیه،من میخوام هر یوزر حداکثر 20 رکورد برای خودش داشته باشه تو تیبلم!

بخاطر این مسئله از کدوم راه استفاده کنم بهتره و چطور؟! چی اضافه کنم؟!

محمدمهدی
محمدمهدی
@laravelista

سلام دوستان راهنمایی های خوبی داشتن نمیدونم چرا دنبال یه روش عجیب هستید ولی به عنوان یه پیشنهاد میتونید قابلیت حذف تعداد مشخصی از سطر های جداول پر استفاده رو در پنل مدیریت قرار بدید که مثلا بر اساس تاریخ قدیمی - لایک کم تر - آخرین ها نمایش داده بشن و شما بتونید خیلی راحت بدون دردسر حذفشون کنید

حسام
حسام
@rebel

تخصص: میکروکنترلرها و الکترونیک دیجیتال

تشکر ویژه از دوست عزیز و بزرگوار @ali.bayat

دوستانی که در آینده به مشکل من برخوردند با با اصلاح کد دوست عزیزمون @ali.bayat که یه مشکل خیلی کوچیک داشت (اررور میداد) به کد پایین رسیدم و جواب گرفتم:

$latest_posts_ids = auth()->user()->temps()->latest()->take(200)->pluck('id')->toArray();

        DB::table('posts')
            ->where('user_id', '=', auth()->user()->id)
            ->whereNotIn('id', $latest_posts_ids)
            ->delete();

kheili mokhlesim @ali.bayat

علی بیات
علی بیات
@ali.bayat

تخصص: توسعه دهنده ارشد وب

@hesamnn

خواهش میکنم
پیروز باشید

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

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