DEV Community

Cover image for Laravel Eloquent ORM in Bangla Part-9 (Query Scopes)
Sontus Chandra Anik
Sontus Chandra Anik

Posted on

Laravel Eloquent ORM in Bangla Part-9 (Query Scopes)

Laravel Eloquent-এ Query Scopes হলো এমন একটি বৈশিষ্ট্য যা আপনাকে পুনরায় ব্যবহৃত কোয়েরিগুলিকে একটি মেথডে সন্নিবেশ করার মাধ্যমে কোড পুনঃব্যবহারযোগ্য করে তোলে। এটি কোড ক্লিন এবং সহজবোধ্য রাখে, বিশেষত যখন আপনি প্রায়ই একই ধরনের কোয়েরি ব্যবহার করতে চান। Query Scopes আপনাকে সাধারণ কোয়েরিগুলি একটি মেথডে সংজ্ঞায়িত করতে দেয়, যা পরবর্তীতে মডেলের সাথে চেইন করে ব্যবহার করা যায়।

১. Global Scopes (বিশ্বব্যাপী স্কোপ)

ব্যাখ্যা:

Global Scopes সব সময় মডেলের সাথে প্রয়োগ হয়। যখন আপনি একটি মডেল ব্যবহার করবেন, তখন এই স্কোপটি স্বয়ংক্রিয়ভাবে অ্যাপ্লাই হয়ে যাবে, আর আপনাকে প্রতিবার সেটি লিখতে হবে না। সাধারণত ব্যবহারকারীর লোগিন স্ট্যাটাস, অ্যাক্টিভ রেকর্ড ইত্যাদি চেক করার জন্য এটি ব্যবহৃত হয়।

গ্লোবাল স্কোপ তৈরি করা:

  1. গ্লোবাল স্কোপ তৈরি করুন:

Laravel-এ Global Scope তৈরি করতে একটি ক্লাস ব্যবহার করতে হয় যা Scope ইন্টারফেসটি ইমপ্লিমেন্ট করে।

use Illuminate\Database\Eloquent\Scope;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;

class ActiveScope implements Scope
{
    public function apply(Builder $builder, Model $model)
    {
        $builder->where('active', 1);  // অ্যাক্টিভ ফিল্টার
    }
}

Enter fullscreen mode Exit fullscreen mode
  1. মডেলে গ্লোবাল স্কোপ ব্যবহার করুন:

এটি আপনার মডেলের boot মেথডে যোগ করতে হবে।

use App\Models\Post;
use App\Scopes\ActiveScope;

class Post extends Model
{
    protected static function booted()
    {
        static::addGlobalScope(new ActiveScope);
    }
}

Enter fullscreen mode Exit fullscreen mode

এখন যখনই আপনি Post::all() ব্যবহার করবেন, তা স্বয়ংক্রিয়ভাবে active = 1 ফিল্টার করবে।

  1. গ্লোবাল স্কোপ বাদ দেওয়া (অস্থায়ীভাবে):
$posts = Post::withoutGlobalScope(ActiveScope::class)->get();

Enter fullscreen mode Exit fullscreen mode

এটি আপনাকে গ্লোবাল স্কোপ সরিয়ে ফেলতে সাহায্য করবে, এবং আপনি সব পোস্ট দেখবেন, যা active ফিল্টার ছাড়া।

২. Local Scopes (লোকাল স্কোপ)

ব্যাখ্যা:

Local Scopes মডেলের ভেতরে একটি নির্দিষ্ট কোয়েরি স্কোপ হিসেবে কাজ করে এবং শুধু তখনই প্রয়োগ হয় যখন আপনি এটি স্পষ্টভাবে কল করেন। এটি গ্লোবাল স্কোপের মতো প্রতিটি কোয়েরি চালানোর সময় স্বয়ংক্রিয়ভাবে প্রয়োগ হয় না।

লোকাল স্কোপ তৈরি করা:

লোকাল স্কোপ তৈরি করতে মডেলে একটি পাবলিক মেথড যোগ করতে হবে, যার প্রথম অর্গুমেন্টে Builder ইনপুট থাকে।

use App\Models\Post;

class Post extends Model
{
    // লোকাল স্কোপ তৈরি
    public function scopeActive($query)
    {
        return $query->where('active', 1);
    }

    public function scopeDraft($query)
    {
        return $query->where('status', 'draft');
    }
}

Enter fullscreen mode Exit fullscreen mode

লোকাল স্কোপ ব্যবহার করা:

// অ্যাক্টিভ পোস্টগুলো পেতে:
$posts = Post::active()->get();

// ড্রাফট পোস্টগুলো পেতে:
$draftPosts = Post::draft()->get();

// চেইন করে ব্যবহার:
$activeDraftPosts = Post::active()->draft()->get();

Enter fullscreen mode Exit fullscreen mode

লোকাল স্কোপে প্যারামিটার যোগ করা:

আপনি চাইলে লোকাল স্কোপে প্যারামিটারও পাঠাতে পারেন।

class Post extends Model
{
    // লোকাল স্কোপ তৈরি
    public function scopeStatus($query, $status)
    {
        return $query->where('status', $status);
    }
}

Enter fullscreen mode Exit fullscreen mode

এখন আপনি status প্যারামিটার দিয়ে স্কোপ ব্যবহার করতে পারবেন:

$posts = Post::status('published')->get();

Enter fullscreen mode Exit fullscreen mode

এখানে 'published' হল প্যারামিটার যা আপনি পাস করেছেন।

৩. Dynamic Scopes (ডাইনামিক স্কোপ)

ডাইনামিক স্কোপ হলো লোকাল স্কোপের একটি ধরণ, যেখানে আপনি স্কোপের নামটি ডাইনামিকভাবে কল করতে পারেন। Laravel আপনাকে এভাবে স্কোপের নাম ব্যবহার করার সুযোগ দেয়, যেমন scopeName()

use App\Models\Post;

class Post extends Model
{
    public function scopePublished($query)
    {
        return $query->where('status', 'published');
    }
}

Enter fullscreen mode Exit fullscreen mode

এখন আপনি স্কোপটি ডাইনামিকভাবে কল করতে পারেন:

$posts = Post::published()->get();

Enter fullscreen mode Exit fullscreen mode

এটি scopePublished() মেথডের মতোই কাজ করবে। স্কোপের নামের প্রথম অক্ষর ছোট হবার কারণে আপনি কেবল published() কল করতে পারবেন।

৪. Multiple Scopes (একাধিক স্কোপ)

Laravel Eloquent-এ একাধিক স্কোপ চেইন করা যায়। যেমন, আপনি status এবং active স্কোপগুলো একসাথে ব্যবহার করতে পারেন।

$posts = Post::active()->status('published')->get();

Enter fullscreen mode Exit fullscreen mode

এটি active এবং status('published') স্কোপ দুটোই প্রয়োগ করবে।

৫. চেইনেবল স্কোপ

Eloquent এর Local Scopes চেইনযোগ্য (chainable) হয়, অর্থাৎ আপনি একাধিক স্কোপ একসাথে ব্যবহার করতে পারেন। যেমন:

$posts = Post::active()->status('published')->orderBy('created_at', 'desc')->get();

Enter fullscreen mode Exit fullscreen mode

এখানে তিনটি স্কোপ এবং একটি orderBy চেইন করা হয়েছে।

Speedy emails, satisfied customers

Postmark Image

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up

Top comments (0)

Heroku

This site is powered by Heroku

Heroku was created by developers, for developers. Get started today and find out why Heroku has been the platform of choice for brands like DEV for over a decade.

Sign Up

👋 Kindness is contagious

Discover a treasure trove of wisdom within this insightful piece, highly respected in the nurturing DEV Community enviroment. Developers, whether novice or expert, are encouraged to participate and add to our shared knowledge basin.

A simple "thank you" can illuminate someone's day. Express your appreciation in the comments section!

On DEV, sharing ideas smoothens our journey and strengthens our community ties. Learn something useful? Offering a quick thanks to the author is deeply appreciated.

Okay