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 চেইন করা হয়েছে।

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)

The best way to debug slow web pages cover image

The best way to debug slow web pages

Tools like Page Speed Insights and Google Lighthouse are great for providing advice for front end performance issues. But what these tools can’t do, is evaluate performance across your entire stack of distributed services and applications.

Watch video

👋 Kindness is contagious

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

Okay