DEV Community

Cover image for Laravel Eloquent ORM in Bangla Part-7 (Pruning Models)
Sontus Chandra Anik
Sontus Chandra Anik

Posted on

Laravel Eloquent ORM in Bangla Part-7 (Pruning Models)

Laravel Eloquent-এ Pruning Models হচ্ছে ডাটাবেসে পুরনো বা অপ্রয়োজনীয় রেকর্ডগুলি স্বয়ংক্রিয়ভাবে মুছে ফেলার প্রক্রিয়া। এটি বড় ডাটাবেসের পারফরম্যান্স উন্নত করতে সাহায্য করে এবং অপ্রয়োজনীয় ডেটা জমে না যেতে দেয়। Laravel এ আপনি pruning করতে পারেন বিশেষভাবে scheduled jobs বা artisan commands ব্যবহার করে।

প্রধান পদ্ধতিগুলি:

১. Old Models Pruning (পুরনো রেকর্ড ডিলিট করা)

যখন কোনো নির্দিষ্ট সময় পর পুরনো রেকর্ড মুছে ফেলা প্রয়োজন হয়, তখন এটি প্রণালীভুক্ত করা হয়। উদাহরণস্বরূপ, আপনি যদি চান যে একটি পোস্ট তৈরি হওয়ার পর ৩০ দিন পর অটোমেটিকভাবে সে পোস্টটি ডিলিট হয়ে যাবে, তাহলে pruning করা হয়।

prune() মেথড ব্যবহার করা:

Laravel Eloquent ৮.x ভার্সন থেকে prune() মেথড প্রবর্তিত হয়েছে। এই মেথডটি বিশেষভাবে কোনো নির্দিষ্ট কন্ডিশন অনুসারে রেকর্ড মুছে ফেলার জন্য ব্যবহৃত হয়।

use App\Models\Post;

class Post extends Model
{
    protected static function booted()
    {
        static::pruning(function ($query) {
            // ৩০ দিন আগে যে পোস্টগুলি তৈরি হয়েছে, সেগুলি ডিলিট করা হবে
            $query->where('created_at', '<', now()->subDays(30));
        });
    }
}

Enter fullscreen mode Exit fullscreen mode

এটি প্রতিবার যখন আপনি Post::prune() চালাবেন, এটি ৩০ দিন আগের পোস্টগুলো ডিলিট করবে।

২. Scheduled Task দিয়ে Pruning

Laravel-এর Task Scheduling ব্যবহার করে আপনি একটি নির্দিষ্ট সময়ে নিয়মিতভাবে পুরনো ডেটা ডিলিট করার কাজটি করতে পারেন।

প্রথমে Task Schedule তৈরি করুন:

  1. app/Console/Kernel.php ফাইলে যেতে হবে এবং সেখানে schedule() মেথডে আপনার pruning কাজটি অ্যাড করতে হবে।
use App\Models\Post;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
    protected function schedule(Schedule $schedule)
    {
        // প্রতিদিন ১টার সময় পুরনো পোস্টগুলো prune করবে
        $schedule->call(function () {
            Post::where('created_at', '<', now()->subDays(30))->delete();
        })->dailyAt('01:00');
    }
}

Enter fullscreen mode Exit fullscreen mode

এখানে প্রতিদিন রাত ১টার সময় পোস্টগুলোর মধ্যে যেগুলি ৩০ দিনের পুরনো হবে, সেগুলি ডিলিট হয়ে যাবে।

৩. Artisan Command দিয়ে Pruning

এছাড়াও, আপনি Artisan command ব্যবহার করে ম্যানুয়ালি pruning কাজ করতে পারেন। Laravel Artisan-এ নতুন কমান্ড তৈরি করে ডেটা মুছে ফেলতে পারেন।

Custom Artisan Command তৈরি করুন:

  1. Command তৈরি করুন:
php artisan make:command PruneOldPosts

Enter fullscreen mode Exit fullscreen mode
  1. app/Console/Commands/PruneOldPosts.php ফাইলে গিয়ে কাস্টম কমান্ড তৈরি করুন:
namespace App\Console\Commands;

use Illuminate\Console\Command;
use App\Models\Post;

class PruneOldPosts extends Command
{
    protected $signature = 'posts:prune-old';
    protected $description = 'Prune posts older than 30 days';

    public function handle()
    {
        // ৩০ দিন আগে যে পোস্টগুলি তৈরি হয়েছে, সেগুলি ডিলিট করা হবে
        Post::where('created_at', '<', now()->subDays(30))->delete();

        $this->info('Old posts pruned successfully!');
    }
}

Enter fullscreen mode Exit fullscreen mode
  1. Command চালান:
php artisan posts:prune-old

Enter fullscreen mode Exit fullscreen mode

এটি ম্যানুয়ালি চলবে এবং ৩০ দিন আগের পোস্টগুলো ডিলিট করবে।

৪. Soft Delete এবং Pruning

কখনও কখনও আপনি সফট ডিলিট ব্যবহার করতে চাইতে পারেন, অর্থাৎ, রেকর্ডটি সম্পূর্ণভাবে ডিলিট না করে শুধু "ডিলিট হওয়া" স্ট্যাটাসে চিহ্নিত করবেন। এ ক্ষেত্রে, সফট ডিলিটের সাথে pruning করতে পারেন।

use App\Models\Post;

class Post extends Model
{
    use SoftDeletes;

    protected static function booted()
    {
        static::pruning(function ($query) {
            // ৩০ দিন পুরনো সফট ডিলিট হওয়া পোস্টগুলো prune করা হবে
            $query->where('deleted_at', '<', now()->subDays(30));
        });
    }
}

Enter fullscreen mode Exit fullscreen mode

এটি সফট ডিলিট হওয়া ৩০ দিন পুরনো পোস্টগুলো মুছে ফেলবে।

৫. Prune এবং Eloquent Relationships

যখন আপনি একটি রেকর্ডের সাথে সম্পর্কযুক্ত (relationship) রেকর্ড ডিলিট করতে চান, তখন আপনাকে সম্পর্কগুলোও মুছে ফেলতে হবে। উদাহরণস্বরূপ, আপনি যদি চান যে একটি পোস্ট ডিলিট হলে তার সাথে সম্পর্কিত মন্তব্যগুলোও ডিলিট হোক, তাহলে Cascade Deletes ব্যবহার করতে পারেন।

class Post extends Model
{
    use SoftDeletes;

    public function comments()
    {
        return $this->hasMany(Comment::class);
    }

    protected static function booted()
    {
        static::deleting(function ($post) {
            // পোস্ট ডিলিট হলে তার সব মন্তব্য ডিলিট হবে
            $post->comments()->delete();
        });
    }
}

Enter fullscreen mode Exit fullscreen mode

এটি নিশ্চিত করবে যে পোস্টটি ডিলিট হলে তার সম্পর্কিত মন্তব্যগুলোও ডিলিট হবে।

Top comments (0)