DEV Community

Cover image for Laravel Eloquent ORM in Bangla Part-2 (Eloquent Model Conventions)
Sontus Chandra Anik
Sontus Chandra Anik

Posted on

Laravel Eloquent ORM in Bangla Part-2 (Eloquent Model Conventions)

Laravel Eloquent Model Conventions হলো একটি সেট রুল বা ডিফল্ট নিয়ম যা মডেল এবং ডাটাবেস টেবিলের মধ্যে সংযোগ তৈরি করে। এই কনভেনশনগুলো মেনে চললে কোড লেখার পরিমাণ কমে যায় এবং ডেভেলপমেন্ট আরও সহজ হয়। তবে আপনি চাইলে এই ডিফল্ট কনভেনশনগুলো কাস্টমাইজ করেও ব্যবহার করতে পারেন।

১. টেবিলের নাম (Table Name)

ডিফল্টভাবে, Eloquent মডেল একটি টেবিলের সাথে সংযুক্ত থাকে যার নাম মডেলের প্লুরাল ফর্ম।

ডিফল্ট নিয়ম:

  • মডেল: Post
  • টেবিল: posts
  • মডেল: Category
  • টেবিল: categories

কাস্টম টেবিল ব্যবহার:

আপনি $table প্রপার্টি ব্যবহার করে কাস্টম টেবিলের নাম সেট করতে পারেন।

class Post extends Model
{
    protected $table = 'blog_posts';
}

Enter fullscreen mode Exit fullscreen mode

২. প্রাইমারি কী (Primary Key)

Eloquent ডিফল্টভাবে ধরে নেয় যে টেবিলের প্রাইমারি কী হলো id

কাস্টম প্রাইমারি কী ব্যবহার:

আপনি $primaryKey প্রোপার্টি দিয়ে প্রাইমারি কী কাস্টমাইজ করতে পারেন।

class Post extends Model
{
    protected $primaryKey = 'post_id';
}

Enter fullscreen mode Exit fullscreen mode

অটো-ইনক্রিমেন্ট এবং নন-ইনক্রিমেন্ট কী:

যদি প্রাইমারি কী ইনক্রিমেন্টাল না হয়, তাহলে $incrementing প্রপার্টি false করুন।

class Post extends Model
{
    protected $primaryKey = 'uuid';
    public $incrementing = false;
}

Enter fullscreen mode Exit fullscreen mode

৩. টাইমস্ট্যাম্প কলাম (Timestamps)

Laravel স্বয়ংক্রিয়ভাবে created_at এবং updated_at কলাম পরিচালনা করে।

টাইমস্ট্যাম্প বন্ধ করতে:

class Post extends Model
{
    public $timestamps = false;
}

Enter fullscreen mode Exit fullscreen mode

কাস্টম টাইমস্ট্যাম্প কলামের নাম:

class Post extends Model
{
    const CREATED_AT = 'creation_date';
    const UPDATED_AT = 'last_update';
}

Enter fullscreen mode Exit fullscreen mode

৪. ফিলেবল এবং গার্ডেড ফিল্ডস (Mass Assignment)

ডিফল্টভাবে, Laravel mass assignment প্রটেকশন দেয়।

$fillable:

$fillable নির্ধারণ করে কোন ফিল্ডে mass assignment অনুমতি দেওয়া হবে।

class Post extends Model
{
    protected $fillable = ['title', 'content'];
}

Enter fullscreen mode Exit fullscreen mode

$guarded:

$guarded নির্ধারণ করে কোন ফিল্ডগুলোতে mass assignment নিষিদ্ধ।

class Post extends Model
{
    protected $guarded = ['id'];
}

Enter fullscreen mode Exit fullscreen mode

৫. সম্পর্ক (Relationships)

Eloquent সম্পর্ক ব্যবহারের জন্য কিছু ডিফল্ট কনভেনশন রয়েছে।

One-to-One Relationship:

class User extends Model
{
    public function profile()
    {
        return $this->hasOne(Profile::class);
    }
}

Enter fullscreen mode Exit fullscreen mode

One-to-Many Relationship:

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

Enter fullscreen mode Exit fullscreen mode

Many-to-Many Relationship:

class Post extends Model
{
    public function tags()
    {
        return $this->belongsToMany(Tag::class);
    }
}

Enter fullscreen mode Exit fullscreen mode

৬. টেবিলের ডিফল্ট নামকরণ (Pivot Table)

Many-to-Many সম্পর্কের ক্ষেত্রে Laravel ডিফল্টভাবে টেবিলের নাম তৈরি করে দুই মডেলের নামের অ্যালফাবেটিক ক্রমানুসারে।

ডিফল্ট টেবিল নাম:

post_tag (যদি মডেল Post এবং Tag হয়)।

কাস্টম পিভট টেবিল নাম:

class Post extends Model
{
    public function tags()
    {
        return $this->belongsToMany(Tag::class, 'custom_pivot_table');
    }
}

Enter fullscreen mode Exit fullscreen mode

৭. মডেল ইভেন্টস (Model Events)

Eloquent মডেল বিভিন্ন ইভেন্ট (যেমন: creating, updating, deleting) ট্রিগার করতে পারে।

class Post extends Model
{
    protected static function booted()
    {
        static::creating(function ($post) {
            $post->slug = Str::slug($post->title);
        });
    }
}

Enter fullscreen mode Exit fullscreen mode

৮. কাস্টম ক্যাশিং কনভেনশন (Global Scopes)

কোনো মডেলে গ্লোবাল স্কোপ যুক্ত করা যায়।

class Post extends Model
{
    protected static function booted()
    {
        static::addGlobalScope('published', function ($query) {
            $query->where('status', 'published');
        });
    }
}

Enter fullscreen mode Exit fullscreen mode

Top comments (0)