سلام دوستان
بنده مدتی هست که نیاز دارم تا row های قدیمی تر یک تیبل از دیتابیسم بر حسب تعداد حذف بشه !
مثلا تعداد row ها که از 20 تا بیشتر شد قدیمی تر ها حذف بشن!
چه کد یا راهی رو پیشنهاد میدین !؟
یه فیلد به جدول اضافه کنید مثلا 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();
نمیدونم الکوئنت برای این کار متد خاصی داشته باشه یا نه..
اما میتونی ۲۰ تا رکورد آخر رو بگیری:
$posts = Post::latest()->take(20)->get();
بعد جدولت رو خالی کنی:
DB::table('posts')->truncate();
سپس با استفاده از یه حلقه foreach داده ها رو پیمایش کنی و وارد دیتابیس کنی:
foreach ($posts as $post)
{
Post::create($post->toArray());
}
البته شاید نیاز باشه کدها رو کمی تغییر بدید
مرسی @ali.bayat محبت کردین..
ولی باید راه بهتر و سریعتری و سبک تری باشه !!!!
و خیلی تعجب میکنم!! چوت این مبحث میتونه خیلی کاربردی باشه و بحث خیلی کمی پیرامونش شده!!!!!
دیتاهای من به صورت مداوم با فاصله زمانی حداقل 5 دقیقه و در طول ماه ها میخوان به سرور ارسال بشن! باید یه راهی باشه که سبک تر باشه.
delete from table_name where ID not in(
select top 200 ID from table_name order by id desc
);
نظرتون برای این کوئری چیه؟!
هنوز تستش نکردم
(این row ها برای هر یوزر جدان)
بله این راه هم شدنی به نظر میرسه..
من سعی کردم در قالب کار با الکوئنت، پاسخی به سوال شما بدم... وگرنه هر زمان لازم باشه میتونیم از کوئری های raw هم استفاده کنیم و خلاص.
یه کار دیگه هم که میشه انجام داد:
با الکوئنت آی دی ۲۰ پست آخر رو در یک آرایه ذخیره کنید:
$latest_posts_ids = Post::latest()->take(20)->pluck('id')->toArray();
بعد با کوئری بیلدر و متد whereNotIn بقیه سطر هارو حذف کنید:
DB::table('posts')
->whereNotIn('id', $latest_posts_ids)
->delete();
@ali.bayat
بینهایت تشکر از محبتتون
یه مسئله دیگه این بود که هر رکورد مناسب یه یوزر آی دیه،من میخوام هر یوزر حداکثر 20 رکورد برای خودش داشته باشه تو تیبلم!
بخاطر این مسئله از کدوم راه استفاده کنم بهتره و چطور؟! چی اضافه کنم؟!
یه فیلد به جدول اضافه کنید مثلا 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
دوستانی که در آینده به مشکل من برخوردند با با اصلاح کد دوست عزیزمون @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
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟