گاهی اوقات ممکن است شما در شرایطی قرار بگیرید که نیاز باشد از یک کد یا یک راه حل چندین مرتبه در کد نویسی خود استفاده کنید. در این صورت ما چگونه و از چه روشی میتوانیم مشکل تکرار چند بارهی کدها در لاراول را حل کنیم؟ لاراول یک راه حل مناسب برای این مشکل ارائه داده است که به وسیله آن شما میتوانید کدهای خود را به عبارات قابل خواندن و قابل استفادهی مجدد تبدیل کنید، این راه حل 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();
همانطور که دیدید از اسکوپها در لاراول بهتر است در هنگام نوشتن کوئریهای تکراری و یا استفاده مجدد از کدها استفاده کرد.
دیدگاه و پرسش
در حال دریافت نظرات از سرور، لطفا منتظر بمانید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید