DEV Community

Sontus Chandra Anik
Sontus Chandra Anik

Posted on

Laravel Eloquent ORM in Bangla Part-1(Generating Model Classes)

Eloquent: Generating Model Classes হলো Laravel-এ ডাটাবেস টেবিলের সাথে ইন্টার‌্যাক্ট করার জন্য মডেল ক্লাস তৈরির একটি প্রক্রিয়া। Eloquent ORM (Object-Relational Mapper) ব্যবহার করে আপনি ডাটাবেস টেবিল থেকে সহজে ডেটা রিড, ক্রিয়েট, আপডেট এবং ডিলিট করতে পারেন।


Model Class তৈরি করার পদ্ধতি

১. Artisan কমান্ড ব্যবহার করে Model তৈরি করা

Laravel-এর artisan CLI ব্যবহার করে মডেল ক্লাস তৈরি করা হয়। নিচের কমান্ডটি রান করুন:

php artisan make:model ModelName

Enter fullscreen mode Exit fullscreen mode

উদাহরণস্বরূপ, একটি Post নামে মডেল তৈরি করতে:

php artisan make:model Post

Enter fullscreen mode Exit fullscreen mode

এটি app/Models ডিরেক্টরির মধ্যে একটি Post.php ফাইল তৈরি করবে।


মডেলের বেসিক কাঠামো

মডেলটি সাধারণত এরকম দেখতে হবে:

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use HasFactory;
}

Enter fullscreen mode Exit fullscreen mode

২. মাইগ্রেশন ফাইল সহ মডেল তৈরি করা

মডেল এবং ডাটাবেস মাইগ্রেশন একসাথে তৈরি করতে নিচের কমান্ড ব্যবহার করুন:

php artisan make:model Post -m

Enter fullscreen mode Exit fullscreen mode

এটি দুটি জিনিস তৈরি করবে:

  1. Post মডেল।
  2. database/migrations/2025_01_05_000000_create_posts_table.php নামে একটি মাইগ্রেশন ফাইল।

৩. মডেলের সাথে Factory এবং Seeder তৈরি করা

Factory এবং Seeder ফাইল সহ মডেল তৈরি করতে:

php artisan make:model Post -mfsc

Enter fullscreen mode Exit fullscreen mode
  • m: মাইগ্রেশন তৈরি করবে।
  • f: ফ্যাক্টরি তৈরি করবে।
  • s: সিডার তৈরি করবে।
  • c: কন্ট্রোলার তৈরি করবে।

মডেলে ডাটাবেস টেবিলের সাথে সম্পর্ক

১. ডিফল্ট টেবিল নাম

Laravel মডেল ক্লাসের নাম অনুযায়ী ডাটাবেস টেবিলের নাম ধরে নেয়।
যেমন:

  • Post মডেলের ডিফল্ট টেবিল হবে posts
  • User মডেলের ডিফল্ট টেবিল হবে users

যদি আপনি কাস্টম টেবিল ব্যবহার করতে চান, তাহলে মডেলে $table প্রোপার্টি সেট করুন:

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

Enter fullscreen mode Exit fullscreen mode

মডেলের গুরুত্বপূর্ণ প্রোপার্টি এবং মেথড

১. $fillable এবং $guarded

ডেটাবেসে কোন কোন ফিল্ডে ডেটা ইনসার্ট করা যাবে তা নির্ধারণ করতে $fillable বা $guarded ব্যবহার করা হয়।

  • $fillable: নির্ধারিত ফিল্ডগুলোতে ডেটা ইনসার্ট করা যাবে।
class Post extends Model
{
    protected $fillable = ['title', 'content'];
}

Enter fullscreen mode Exit fullscreen mode
  • $guarded: নির্ধারিত ফিল্ডগুলোতে ডেটা ইনসার্ট করা যাবে না।
class Post extends Model
{
    protected $guarded = ['id'];
}

Enter fullscreen mode Exit fullscreen mode

২. $primaryKey

যদি আপনার টেবিলের প্রাইমারি কী id ছাড়া অন্য কিছু হয়:

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

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

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

Eloquent সম্পর্ক ব্যবহারে মডেল একে অপরের সাথে যুক্ত করা যায়।

  • এক থেকে এক সম্পর্ক (One-to-One):
public function user()
{
    return $this->hasOne(User::class);
}

Enter fullscreen mode Exit fullscreen mode
  • এক থেকে অনেক সম্পর্ক (One-to-Many):
public function comments()
{
    return $this->hasMany(Comment::class);
}

Enter fullscreen mode Exit fullscreen mode
  • অনেক থেকে অনেক সম্পর্ক (Many-to-Many):
public function tags()
{
    return $this->belongsToMany(Tag::class);
}

Enter fullscreen mode Exit fullscreen mode

Sentry blog image

How I fixed 20 seconds of lag for every user in just 20 minutes.

Our AI agent was running 10-20 seconds slower than it should, impacting both our own developers and our early adopters. See how I used Sentry Profiling to fix it in record time.

Read more

Top comments (0)

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay