آشنایی با scope در لاراول

گردآوری و تالیف : رضا جمال زاده
تاریخ انتشار : 13 آبان 1398
دسته بندی ها : لاراول

گاهی اوقات ممکن است شما در شرایطی قرار بگیرید که نیاز باشد از یک کد یا یک راه حل چندین مرتبه در کد نویسی خود استفاده کنید. در این صورت ما چگونه و از چه روشی می‌توانیم مشکل تکرار چند باره‌ی کدها در لاراول را حل کنیم؟ لاراول یک راه حل مناسب برای این مشکل ارائه داده است که به وسیله آن شما می‌توانید کدهای خود را به عبارات قابل خواندن و قابل استفاده‌ی مجدد تبدیل کنید، این راه حل scope نامیده می‌شود.

 در این مقاله ما می‌خواهیم به بررسی چگونگی استفاده از scopeها در لاراول بپردازیم پس با ما همراه باشید.

آشنایی با scope در لاراول

ایجاد scope در لاراول

تصور کنید شما در حال ایجاد یک اپلیکیشن مدیریت پروژه‌ها هستید و در قسمت‌های مختلف این اپلیکیشن شما نیاز دارید که پروژه‌های تکمیل شده را نشان دهید. شما می‌توانید از کوئری زیر برای بازیابی پروژه‌های کامل شده در اپلیکیشن خود استفاده کنید:

$completedProjects = Project::where('completed'. 1)->get();

شما ممکن است نیاز داشته باشید تا از کد بالا در قسمت‌های مختلف اپلیکیشن خود بارها و بارها استفاده کنید، شما می‌توانید از اسکوپ‌های لاراول برای تمیز و مرتب‌تر شدن کدنویسی خود و همچنین جلوگیری از تکرار مجدد کدها استفاده کنید. یک اسکوپ در واقع یک متد است که در مدل مورد نظر ما قرار می‌گیرد، کوئری که می‌خواهیم بر روی مدل اعمال کنیم، مانند کوئری بالا، در این متد قرار می‌گیرد.

برای تعریف اسکوپ در مدل خود پیش از نام متد کلمه scope را قرار می‌دهیم مانند زیر:

class Project extends Model
{
    public function scopeCompleted($query)
    {
        return $query->where('completed', 1);
    }
}

پس از تعریف اسکوپ بالا ما می‌توانیم از آن مانند زیر استفاده کنیم:

$completedProjects = Project::completed()->get();

ایجاد اسکوپ‌های داینامیک در لاراول 

در ادامه اگر شما می‌خواهید اسکوپ خود را به یک اسکوپ داینامیک تبدیل کنید و به وسیله آن می‌خواهید پروژه‌های تکمیل شده(completed) را به صورت داینامیک دریافت کنید تنها کافی است که یک پارامتر ورودی را در متد موجود در مدل خود تعریف کنید، مانند مثال زیر:

class Project extends Model {

    public function scopeCompleted($query, $arg)
    {
        return $query->where('completed', $arg);
    }
}

پس از تعریف پارامتر ورودی شما می‌توانید از اسکوپ خود مانند زیر استفاده کنید:

// Get completed projects
$completedProjects = Project::completed(1)->get();

// Get incomplete projects
$nonCompletedProjects = Project::completed(0)->get();

استفاده از اسکوپ‌ها به همراه روابط

گاهی اوقات ممکن است شرایطی پیش بیاید که به استفاده از اسکوپ‌ها در روابط نیاز باشید، به عنوان مثال شما می‌توانید لیستی از پروژهای یک کاربر خاص را بازیابی کنید:

$user = User::findOrFail(1); // 1 is user id
$completedProjects = $user->projects()->completed(1)->get();

همانطور که دیدید از اسکوپ‌ها در لاراول بهتر است در هنگام نوشتن کوئری‌های تکراری و یا استفاده مجدد از کدها استفاده کرد.

منبع

مقالات پیشنهادی

  • استفاده از عبارات منظم در روت‌های لاراول

    در مقاله قبل به توضیح و بررسی کامل روت‌ها در لاراول پرداختیم و به طور مختصر در مورد ویژگی‌های مختلف این عنصر لاراول توضیح دادیم. در این مقاله قصد داری...

    رضا جمال زاده
  • آشنایی با پکیج custom casts در لاراول

    اگر شما از جمله کسانی هستید که برای توسعه وب سایت خود از فریمورک لاراول استفاده می‌کنید حتما از خصوصیات casts  در مدل خود استفاده کرده‌اید، در واقع ca...

    رضا جمال زاده