حسام
5 سال پیش توسط حسام مطرح شد
8 پاسخ

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

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

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


ثبت پرسش جدید
علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 5 سال پیش مطرح شد
1

یه فیلد به جدول اضافه کنید مثلا 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 5 سال پیش مطرح شد
2

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

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

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

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

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

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

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

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


حسام
تخصص : میکروکنترلرها و الکترونیک دیجی...
@rebel 5 سال پیش آپدیت شد
0

مرسی @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 5 سال پیش مطرح شد
1

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

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


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

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

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

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

DB::table('posts')
    ->whereNotIn('id', $latest_posts_ids)
    ->delete();

حسام
تخصص : میکروکنترلرها و الکترونیک دیجی...
@rebel 5 سال پیش آپدیت شد
0

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

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


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 5 سال پیش مطرح شد
1

یه فیلد به جدول اضافه کنید مثلا 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();

محمدمهدی
@laravelista 5 سال پیش مطرح شد
0

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


حسام
تخصص : میکروکنترلرها و الکترونیک دیجی...
@rebel 5 سال پیش آپدیت شد
0

تشکر ویژه از دوست عزیز و بزرگوار @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 5 سال پیش مطرح شد
0

@hesamnn

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


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

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