کار با دیتابیس به شکلی صحیح و منظم همواره یکی از چالش‌های توسعه‌دهندگان وب بوده است. لاراول به عنوان یکی از محبوب‌ترین فریمورک‌های PHP ابزارهای قدرتمندی را برای ساده‌تر کردن ارتباط با دیتابیس در اختیار برنامه‌نویسان قرار داده است. Eloquent ORM یکی از ابزارهای کار با دیتابیس است که توسط لاراول ارائه شده است. Eloquent ORM در لاراول با استفاده از رویکرد شی‌گرایانه ارتباط بین کدهای برنامه و دیتابیس را بسیار آسان می‌کند. با استفاده از این ابزار دیگر نیازی به نوشتن کدهای پیچیده SQL ندارید. همچنین، نیاز نیست که زمان زیادی را صرف خطایابی کنید یا جداول دیتابیس را به صورت دستی به یکدیگر وصل کنید.

فهرست مطالب این نوشته
997696

در این مطلب از مجله فرادرس به زبان ساده همراه با مثال‌های کاربردی نحوه کار با Eloquent ORM در لاراول، اهمیت و ضرورت استفاده از آن در ساخت وب‌سایت‌ها و وب‌اپلیکیشن‌های مدرن مورد بررسی قرار گرفته است. با مطالعه این مطلب یاد خواهید گرفت که چگونه از Eloquent برای مدیریت دیتابیس استفاده کنید و این کار را به فرایندی آسان و لذت‌بخش تبدیل کنید.

ORM چیست؟

ORM مخفف عبارت «نگاشت شی رابطه‌ای» (Object-Relational Mapping) است که در زمینه ارتباط با پایگاه داده مورد استفاده قرار می‌گیرد. به زبان ساده، ORM یک تکنیک برنامه نویسی است که بین داده‌های موجود در پایگاه داده و اشیا موجود در زبان‌های برنامه نویسی ارتباط برقرار می‌کند. در واقع، استفاده از ORM برای ارتباط با پایگاه داده نسبت به دستورات سنتی SQL ساده‌تر است و علاوه بر آن موجب خوانایی و امنیت بیشتر کد نیز می‌شود.

برای درک بهتر تفاوت بین ORM و دستورات سنتی SQL به مثال زیر توجه کنید. قطعه کد زیر به‌روزرسانی یک رکورد در یکی از جداول پایگاه داده با دستورات سنتی SQL را نشان می‌دهد.

در نقطه مقابل، همین عملیات با استفاده از تکنیک ORM با Eloquent در لاراول پیاده‌سازی شده است که قطعه کد مربوط به آن در ادامه آورده شده است.

همان طور که مشاهده می‌کنید، در زمان استفاده از تکنیک ORM دیگر نیازی به نوشتن دستورات SQL نیست و مشابه برنامه نویسی شی‌گرا می‌توان عملیات مورد نظر را پیاده‌سازی کرد. بعد از آشنایی با تکنیک ORM در ادامه این نوشته به زبان ساده مبحث Eloquent ORM در لاراول مورد بررسی قرار خواهد گرفت.

چه روش هایی برای کار با دیتابیس در لاراول وجود دارد؟

لاراول یکی از محبوب‌ترین فریمورک‌های PHP است که به منظور کار با دیتابیس روش‌های متنوعی را در اختیار برنامه‌نویسان قرار می‌دهد. توسعه‌دهندگان با توجه به نوع پروژه و نیاز خود می‌توانند یکی از روش‌های زیر را برای ارتباط با پایگاه داده استفاده کنند.

  • Eloquent ORM
  • Query Builder
  • Raw SQL Queries

در ادامه به صورت مختصر هر کدام از روش‌های ارائه شده در بالا مورد بررسی قرار گرفته‌اند.

روش های کار با دیتابیس در لاراول - Eloquent ORM در لاراول

Eloquent ORM در لاراول چیست؟

Eloquent در لاراول به منظور ارتباط با پایگاه داده از یک الگوی طراحی به نام Active Record استفاده می‌کند. در این الگوی طراحی هر جدول در پایگاه داده به عنوان یک کلاس در نظر گرفته می‌شود و هر رکورد یا سطر موجود در جدول یک شی از آن کلاس محسوب می‌شود. این شی ضمن دارا بودن تمام داده‌های مربوط به رکورد دارای متدهایی نیز برای انجام عملیات اصلی مانند ذخیره، به‌روزرسانی یا حذف آن رکورد است.

Eloquent ORM در لاراول به توسعه‌دهندگان این امکان را می‌دهد که به صورت شی‌گرا و بدون نیاز به نوشتن دستورات SQL عملیات‌های مختلف مرتبط با پایگاه داده را پیاده‌سازی کنند. قطعه کد زیر مثالی از Eloquent ORM در لاراول را نشان می‌دهد.

در مثال بالا مدلی با نامUser تعریف شده است که نمایانگر جدولuser در پایگاه داده است. سپس، با استفاده از متدهایUser::find(1) و$user->save() می‌توان به راحتی به رکورد مد نظر دسترسی داشت و تغییرات لازم را پیاده‌سازی کرد. در مجموع استفاده از این روش موجب بهبود خوانایی و افزایش نگهداری کد می‌شود.

منظور از Query Builder در لاراول چیست؟

روش دیگر برای کار با دیتابیس در لاراول استفاده از Query Builder است. در این شیوه یک لایه انتزاعی برای نوشتن کوئری‌ها به صورت زنجیره‌ای ایجاد می‌شود. با استفاده از این شیوه دیگر نیازی به نوشتن کوئری‌های پیچیده نیست و با استفاده از متدهای لاراول می‌توان کوئری‌های پیچیده را پیاده‌سازی کرد. قطعه کد زیر مثالی از Query Builder در لاراول را نشان می‌دهد.

استفاده از این شیوه ضمن افزایش امنیت موجب انعطاف‌پذیری بیشتر کد نیز می‌شود و برنامه‌نویس به سادگی ‌می‌تواند با توجه به نیاز خود کوئری‌های پیچیده‌ای را طراحی کند.

Raw SQL Queries در لاراول چگونه کار می‌کند؟

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

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

Eloquent ORM در لاراول چگونه کار می‌کند؟

Eloquent ORM در لاراول به توسعه‌دهندگان امکان می‌دهد تا با داده‌های موجود در پایگاه داده به شیوه‌ای شی‌‌گرا کار کنند و دیگر نیازی به نوشتن دستورات SQL به صورت مستقیم نداشته باشند.

برنامه نویسی که روی میز خود در حال کار کردن است.

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

آموزش کار با Eloquent ORM در لاراول

برای شروع کار با Eloquent ORM در لاراول باید یک مدل Eloquent ایجاد کنید. به زبان ساده برای کار با پایگاه داده باید یک کلاس مدل مانندPost ،User و سایر موارد مشابه دیگر را پیاده‌سازی کنید که این کلاس نمایانگر یکی از جداول پایگاه داده شما است.

به صورت پیش‌فرض مدل‌ها در پوشهapp قرار می‌گیرند، ولی می‌توان آن‌ها را در هر جایی قرار داد. این مورد به شرطی است که تنظیماتcomposer.json اجازه «بارگذاری خودکار» (auto-loading) را به شما بدهد. در واقع، سیستم به صورت خودکار فایل را پیدا کرده و آن‌ها را بارگذاری می‌کند. نکته مهم دیگر این است که تمام مدل‌های Eloquent از کلاسIlluminateDatabaseEloquentModel ارث‌بری می‌کنند. این کلاس پایه امکانات لازم برای کار با دیتابیس را در اختیار توسعه‌دهنده قرار می‌دهد. در ادامه این بخش از نوشته به صورت گام‌به‌گام نحوه کار با Eloquent ORM در لاراول آموزش داده خواهد شد.

مراحل کار با Eloquent ORM در لاراول

گام ۱: ایجاد مدل

ساده‌ترین راه برای ایجاد مدل در Eloquent استفاده از دستورات Artisan است. قطعه کد زیر یک مدل جدید با نامUser ایجاد می‌کند.

php artisan make:model User

با اجرا دستور بالا یک مدل با نامUser و یک فایل migration برای ایجاد جدولusers در پوشهdatabase/migrations ایجاد می‌شود.

گام ۲: تنظیم فایل migration

در فایل migration می‌توان ساختار جدول را مشخص کرد. برای این منظور این فایل را باز و دستورات زیر را در آن وارد کنید.

به منظور اعمال تغییرات دستور زیر را اجرا کنید.

php artisan migrate

انجام تنظیمات فایل migration الزامی نیست. در صورت عدم تنظیم این فایل Eloquent به صورت پیش‌فرض جدولusers را برای مدلUser ایجاد می‌کند. البته می‌توان با تعیین مقدار دلخواه برای متغیر$table نام جدول را در مدل تغییر داد. قطعه کد زیر نحوه تغییر نام جدول از طریق مدل را نشان می‌دهد.

همچنین به صورت پیش‌فرض جداول ایجاد شده توسط مدل دارای ستون‌هایupdated_at وcreated_at هستند که به ترتیب فیلدهای به‌روزرسانی و ایجاد اطلاعات را نشان می‌‌دهند. برای غیرفعال کردن این ستون‌ها نیز می‌توان متغیر$timestamps را برابر مقدار false قرار داد.

گام ۳: مشخص کردن فیلدهای Fillable

خاصیت fillable در Eloquent یک آرایه است که تعیین می‌کند که کدام فیلدهای جدول مجاز به «تخصیص انبوه» (Mass Assignment) داده هستند. به زبان ساده زمانی که قصد دارید تا چندین فیلد را به صورت همزمان از ورودی‌های کاربر یا از داده‌های دیگر مقداردهی کنید، تنها فیلدهای تعریف شده در آرایه fillable مجاز به مقداردهی هستند. این روش به عنوان یک مکانیزم امنیتی مورد استفاده قرار می‌گیرد تا از به‌کارگیری ناخواسته یا تغییرات غیرمجاز جلوگیری کند.

به منظور تعیین فیلدهای fillable کافی است تا فایل مدل یعنیUser.php را باز کنید که به طور معمول در مسیرapp/Models قرار دارد. قطعه کد زیر نحوه تعریف فیلدهای fillable را نشان می‌دهد.

در مثال بالا فیلدهایname ،email وpassword به عنوان fillable تعریف شده‌اند و امکان مقداردهی آن‌ها به صورت امن وجود دارد.

گام ۴: ایجاد رکورد جدید با Eloquent ORM در لاراول

همان طور که پیش‌تر نیز عنوان شد، Eloquent ORM در لاراول کار با دیتابیس را بسیار آسان می‌کند. برای ایجاد رکورد جدید با استفاده از Eloquent کافی است تا یک شی جدید از مدلUser ایجاد کنید. سپس، فیلدهای مرتبط با آن را مقداردهی کرده و ذخیره کنید.

قطعه کد بالا نحوه ایجاد یک رکورد جدید با Eloquent ORM در لاراول را نشان می‌دهد.

گام ۵: خواندن رکوردها با Eloquent ORM در لاراول

برای خواندن تمام رکوردهای موجود در جدول می‌توان از متدall() استفاده کرد که نحوه استفاده از آن در ادامه آورده شده است.

همچنین، به منظور پیدا کردن یک رکورد با شناسه مشخص نیز می‌توان از متدfind(index) استفاده کرد که قطعه کد زیر نحوه استفاده از آن را نشان می‌دهد.

در مثال بالا کاربر با شناسه ۱ با استفاده از متدfind در جدول User پیدا شده است.

گام ۶: به‌روزرسانی رکوردها با Eloquent ORM در لاراول

تغییر مقادیر مربوط به رکوردهای جدول یا همان به‌روزرسانی رکوردها با Eloquent ORM در لاراول از آنچه که فکر می‌کنید نیز آسان‌تر است. برای به‌روزرسانی یک رکورد در گام نخست باید رکورد مورد نظر را پیدا کنید و سپس، فیلدهای مورد نظر را مقداردهی کرده و تغییرات را ذخیره کنید.

در مثال بالا با استفاده از متدfind() رکورد مورد نظر پیدا شده و در متغیر$user ذخیره می‌شود. سپس، فیلدname مربوط به این رکورد به‌روزرسانی می‌شود.

گام ۷: حذف رکورد با Eloquent ORM در لاراول

برای حذف یک رکورد از جدول نیز ابتدا باید رکورد مورد نظر را با استفاده از متدfind() پیدا کرده و سپس با استفاده از متدdelete() این رکورد را حذف کنید.

قطعه کد بالا نحوه حذف رکورد از جدول را با استفاده از Eloquent در لاراول نشان می‌دهد.

گام ۸: فیلتر کردن رکوردها با Eloquent ORM در لاراول

با استفاده از متدwhere می‌توان تنها رکوردهای مورد نظر را فیلتر کرد. قطعه کد زیر نحوه فیلتر کردن رکوردها با Eloquent را نشان می‌دهد.

در مثال بالا رکوردهایی فیلتر می‌شوند که فیلدstatus برای آن‌ها برابر مقدارactive باشد.

یادگیری لاراول با فرادرس

لاراول یکی از محبوب‌ترین فریمورک‌های PHP است که به شما امکان می‌دهد تا وب‌سایت‌ها و وب‌اپلیکیشن‌هایی سریع‌تر، امن‌تر و با خوانایی بالاتر را توسعه دهید. فریمورک لاراول گزینه بسیار مناسبی برای توسعه یک وب‌سایت بزرگ با پایگاه داده پیچیده محسوب می‌شود، زیرا ابزارهای لازم برای این کار را نیز ارائه می‌کند. با یادگیری لاراول می‌توانید بر روی پروژه‌های بزرگ‌تری کار کنید و فرصت‌های شغلی بهتری نیز داشته باشید.

پیش از شروع یادگیری لاراول باید با مقدمات زبان PHP به طور کامل آشنا شوید و مفاهیم پایه‌ای PHP نظیر توابع، شی‌گرایی و مدیریت پایگاه داده را درک کنید. بنابراین، اگر آشنایی کمی با PHP دارید یا در این زمینه احساس ضعف می‌کنید، پیشنهاد می‌شود که ابتدا زمانی را برای یادگیری PHP صرف کنید. در گام بعدی باید لاراول را بر روی سیستم خود نصب و راه‌اندازی کنید و با ابزارهای اصلی در مدیریت لاراول نظیر Composer و Artisan آشنا شوید. سپس، باید به سراغ یادگیری ساختار پروژه‌های لاراول بروید. هر پروژه لاراول شامل بخش‌هایی همچون Controllers ،Routes ،Views و Models است که باید نقش و عملکرد هر یک از این بخش‌ها را به طور کامل درک کنید.

مجموعه فیلم‌های آموزش لاراول – مقدماتی تا پیشرفته فرادرس
برای مشاهده مجموعه فیلم‌های آموزش لاراول – مقدماتی تا پیشرفته فرادرس، بر روی تصویر کلیک کنید.

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

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

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

چند مثال از کار با Eloquent ORM در لاراول

Eloquent ORM در لاراول با ارائه رویکرد شی‌گرایانه کار با دیتابیس را بسیار آسان کرده است. در بخش قبلی مقدمات مربوط به کار با Eloquent ارائه شد. بر همین اساس در ادامه به بررسی مباحث تکمیلی مورد نیاز برای کار با Eloquent ORM خواهیم پرداخت.

چگونه می‌توان کلید اصلی جدول در Eloquent را تغییر داد؟

Eloquent هنگام ساخت مدل به صورت پیش‌فرض جدولی در پایگاه داده ایجاد می‌کند که فیلدid در این جدول را به عنوان «کلید اصلی» (primary key) در نظر می‌گیرد. پیش‌تر در مطلب زیر از مجله فرادرس انواع کلید در پایگاه مورد بررسی قرار گرفته است.

در صورت نیاز می‌توان با تعیین متغیر محافظت شده$primaryKey ستون دیگری را به عنوان کلید اصلی مشخص کرد. در مثال زیر نحوه تغییر کلید اصلی جدول نشان داده است.

در قطعه کد بالا ستونflight_id به عنوان کلید اصلی جدولFlight مشخص شده است. همچنین، Eloquent به صورت پیش‌فرض کلید اصلی جدول را یک عدد صحیح افزایشی در نظر می‌گیرد که این مورد بدین معنا است که Eloquent به صورت خودکار بعد از اضافه شدن هر رکورد جدید به جدول این مقدار را یک واحد افزایش می‌دهد. در صورت نیاز با مقداردهی متغیر$incrementing برابر مقدارfalse می‌توان افزایش خودکار کلید اصلی را غیرفعال کرد. قطعه کد زیر این مورد را نشان می‌دهد.

علاوه بر این، امکان تغییر نوع کلید اصلی جدول نیز وجود دارد و می‌توان یک نوع غیرعددی برای کلید اصلی در نظر گرفت. برای تغییر نوع کلید اصلی باید متغیر محافظت شده$keyType را تغییر داد.

در مثال بالا نوع کلید اصلی رشته یا String انتخاب شده است.

کاربرد UUID و ULID در Eloquent چیست؟

همان طور که می‌دانید تمام رکوردهای موجود در جداول پایگاه داده نیاز به یک کلید اصلی دارند تا به صورت یکتا شناسایی شوند. به صورت معمول کلیدهای اصلی به صورت عددی و افزایشی هستند. در نقطه مقابل، امکان تعریف کلیدهایی از نوع رشته نیز در Eloquent وجود دارد.

برای این منظور می‌توان از کلیدهای UUID و ULID استفاده کرد. کلیدهای UUID و ULID به صورت یک شناسه ۱۲۸ بیتی رشته‌ای و تصادفی تولید می‌شوند. برای ایجاد کلید UUID در لاراول می‌توان از متدStr::uuid() استفاده کرد و در نقطه مقابل، برای ایجاد کلید ULID نیز از متدStr::ulid() استفاده می‌شود. قطعه کد زیر نحوه تعریف کلید از نوع UUID را نشان می‌دهد.

در مثال بالا به منظور تعریف کلید UUID متغیرهای$incrementing و$keyType به ترتیب برابر مقدارfalse وstring قرار داده شده‌اند.

مزایای استفاده از کلیدهای UUID و ULID در Eloquent چیست؟

هر رکوردی در جداول پایگاه نیازمند یک کلید اصلی است تا به صورت منحصر به فرد شناسایی شود. در هر حالت عادی کلیدهای اصلی از نوع عددی و به صورت افزایشی هستند ولی کلیدهای UUID و ULID به صورت رشته‌ای تعریف می‌شوند.

مزایای استفاده از کلیدهای UUID و ULID در Eloquent

از جمله مزایای این نوع کلیدها به موارد زیر می‌توان اشاره کرد.

  • یکتا بودن: کلیدهای UUID و ULID شناسه‌های یکتایی را تولید می‌کنند. استفاده از این نوع کلیدها احتمال تکراری شدن شناسه را به صفر می‌رساند حتی اگر رکوردهایی از سرورها یا سایر بخش‌های مختلف سیستم وارد شوند.
  • عدم نمایش الگوی افزایشی: استفاده از شناسه‌های عددی افزایشی سبب می‌شود تا اطلاعاتی مانند تعداد رکوردها یا ترتیب ورود آن‌ها در جدول قابل تشخیص باشد. در نتیجه، استفاده از کلیدهای UUID و ULID این مشکل را برطرف می‌کند.
  • جلوگیری از تداخل شناسه‌ها: در صورت وارد کردن داده‌ها و رکوردها از منابع و سرورهای مختلف، استفاده از کلیدهای UUID و ULID از بروز اختلال جلوگیری می‌کند.

در مجموع، استفاده از کلیدهای UUID و ULID در Eloquent نسبت به شناسه‌های عددی به شما امکان می‌دهد تا شناسه‌هایی پیچیده‌تر و امن‌تر در اختیار داشته باشید.

ویژگی Timestamps در Eloquent چه کاربردی دارد؟

ویژگی Timestamps در Eloquent به صورت خودکار زمان ایجاد و به‎‌روزرسانی رکوردها در پایگاه داده را مدیریت می‌کند. به زبان ساده هنگام ساخت مدل با Eloquent ORM در لاراول به صورت پیش‌فرض ستون‌هایcreated_at وupdated_at توسط Eloquent به جدول اضافه می‌شوند.

در نتیجه این امر همزمان با ایجاد رکورد جدید فیلدcreated_at ثبت می‌شود و با به‌روزرسانی رکورد فیلدupdated_at به‌روزرسانی می‌شود. این کار به توسعه‌دهندگان امکان می‌دهد تا بدون نیاز به کد نویسی جداگانه تاریخچه تغییرات مربوط به تمامی رکوردهای جدول را در اختیار داشته باشند. به صورت پیش‌فرض ویژگی Timestamps در Eloquent فعال است و برای غیرفعال‌سازی آن می‌توانید مقدار متغیر$timestamps را برابرfalse قرار دهید. قطعه کد زیر نحوه انجام این کار را نشان می‌دهد.

علاوه بر این، امکان تغییر نام ستون‌هایcreated_at وupdated_at در Eloquent وجود دارد. برای این منظور کافی است تا فیلدهایCREATED_AT وUPDATED_AT را در مدل تغییر دهید. قطعه کد زیر نحوه انجام این کار را نشان می‌دهد.

با انجام تغییرات بالا از این پس ستون‌هایcreation_date وlast_update به ترتیب برای ذخیره زمان ایجاد و به‌روزرسانی رکورد مورد استفاده قرار خواهند گرفت.

کاربرد متدهای fresh و refresh در Eloquent چیست؟

در حین کار بر روی پروژه لاراول امکان تغییر داده‌ها یا ساختار جداول پایگاه داده وجود دارد. بنابراین، نیاز است تا اطلاعات مدل به‌روزرسانی شود. متدهایfresh وrefresh در Eloquent به منظور به‌روزرسانی اطلاعات مدل از پایگاه داده مورد استفاده قرار می‌گیرند. متدfresh یک نسخه جدید از مدل با آخرین اطلاعات را دریافت می‌کند. در واقع، با فراخوانی این متد یک کپی جدید از شی با آخرین اطلاعات را به دست خواهید آورد.

در نقطه مقابل، متدrefresh
 تنها اطلاعات مربوط به شی موجود را با آخرین داده‌های جدید به‌روزرسانی می‌کند. قطعه کد زیر نحوه فراخوانی این متد را نشان ‌می‌دهد.

Eloquent چگونه با دیتابیس های بزرگ کار می‌کند؟

هنگام کار با دیتابیس‌های بزرگ مهم‌ترین مسئله مصرف بالای حافظه است. در واقع، با توجه به حجم بالای اطلاعات و رکوردها بارگذاری همزمان این تعداد رکورد باعث کندی یا حتی به وجود آمدن خطای حافظه می‌شود. Eloquent ORM در لاراول به منظور حل این مشکل چند راهکار هوشمندانه را ارائه می‌کند که به توسعه‌دهندگان کمک می‌کند تا بدون به‌کارگیری منابع زیاد، رکوردها را به قسمت‌های کوچکتر تقسیم و پردازش کنند. مهم‌ترین روش‌ها در این زمینه عبارتنداز:

  • متد chunk
  • متد lazy
  • متد cursor

در ادامه این بخش به بررسی متدهای Chunk و Lazy خواهیم پرداخت.

نحوه پردازش دیتابیس‌های بزرگ با Eloquent ORM در لاراول

کاربرد متد Chunk در Eloquent لاراول چیست؟

یکی از مشکلات توسعه‌دهندگان هنگام کار با دیتابیس پردازش حجم بالایی از اطلاعات است. به عنوان مثال، اگر قصد پردازش تمام داده‌های یک جدول مثلاً  ۱۰۰۰۰۰ کاربر را داشته باشید و این اطلاعات را به یکباره از دیتابیس بخوانید، اتفاقی که رخ می‌دهد این است که حافظه سرور پر شده و برنامه با مشکل روبرو خواهد شد.

برنامه نویس پشت مانیتوری بسیار بزرگ نشسته است و در حال پردازش دیتابیس‌های بزرگ با Eloquent ORM در لاراول است

Eloquent ORM در لاراول با ارائه روشی تحت عنوان متد Chunk این مشکل را حل کرده است. در این روش داده‌ها به صورت تکه شده به عنوان مثال (۲۰۰ تا ۲۰۰ تا) از پایگاه داده دریافت می‌شوند تا منابع حافظه مدیریت شود. فرض کنید در جدولusers می‌خواهیم تمام ۱ میلیون رکورد موجود را پردازش کنیم. روش اول برای این کار نوشتن این کد خطرناک است تا تمام اطلاعات کاربران به صورت یکجا دریافت شود.

با نوشتن قطعه کد بالا حافظه سرور پر شده و برنامه دچار مشکل می‌شود. روش مناسب برای پردازش اطلاعات در این حالت استفاده از متدchunk() است که نحوه پیاده‌سازی آن در ادامه آورده شده است.

در مثال بالا رکوردهای موجود در جدولusers به صورت ۲۰۰ تا ۲۰۰ تا پردازش می‌شوند. برای درک بهتر مفهوم Chunk فرض کنید که می‌خواهید به تمام کاربران ایمیل ارسال کنید. در این حالت ابتدا ۲۰۰ کاربر اول خوانده می‌شوند و ایمیل ارسال می‌شود. سپس، حافظه پاک شده و ۲۰۰ کاربر بعدی خوانده می‌شوند و این روال ادامه پیدا می‌کند.

متد Lazy در Eloquent لاراول چگونه کار می کند؟

شرایطی را در نظر بگیرید که لیست بزرگی از کاربران به عنوان مثال ۱ میلیون کاربر در پایگاه داده دارید. در این شرایط امکان پردازش این تعداد از کاربران به صورت یک مرتبه وجود ندارد، زیرا حافظه سرور پر شده و برنامه با اختلال مواجه می‌شود.

استفاده از متد Lazy در Eloquent این مشکل را حل می‌کند. متد Lazy داده‌ها را آرام آرام و یک به یک از پایگاه داده می‌خواند. این فرایند را می‌توان به حرکت اجسام بر روی نوار نقاله تشبیه کرد. قطعه کد زیر نحوه پیاده‌سازی متد Lazy در Eloquent را نشان می‌دهد.

در مثال بالا حلقهforeach در هر مرتبه تنها یک رکورد جدید را از پایگاه داده می‌خواند و بعد از پردازش هر کاربر حافظه اشغال شده به طور کامل آزاد می‌شود. استفاده از متد Lazy مانند این است که یک کتاب ۱۰۰۰ صفحه‌ای را خط‌به‌خط بخوانید، نه اینکه تمام صفحات کتاب را یکجا باز کنید. ذکر این نکته نیز ضروری است که متد Lazy از نسخه ۸ لاراول به بالا پشتیبانی می‌شود.

تفاوت متد Lazy با Chunking در Eloquent لاراول چیست؟

Eloquent ORM در لاراول برای پردازش حجم بالای اطلاعات متدهای Lazy و Chunk را در اختیار توسعه‌دهندگان قرار داده است. این دو متد کاربردی از نظر عملکرد مشابه هستند، ولی در سایر جنبه‌ها با یکدیگر تفاوت دارند. تفاوت‌های این دو متد در جدول زیر آورده شده است.

ویژگی متد ()chunk متد ()lazy
نحوه دریافت داده دسته‌های ثابت یک‌به‌یک
مدیریت حافظه بعد از هر دسته حافظه پاک می‌شود بعد از پردازش هر رکورد حافظه پاک می‌شود
موارد استفاده پردازش گروهی پردازش تکی
تغییرات حین اجرا امکان بروز خطا امنیت بالاتر

برای درک بهتر تفاوت این دو متد مهم در Eloquent لاراول شرایطی را در نظر بگیرید که قصد ارسال ۱۰۰۰ نامه را دارید. نحوه ارسال نامه با هر کدام از این متدها به صورت زیر خواهد بود.

  • متد chunk:
    1. ۲۰۰ نامه آماده شده و ارسال می‌شوند.
    2. حافظه آزاد می‌شود.
    3. سپس، ۲۰۰ نامه بعدی ارسال می‌شوند و این فرایند تا پایان ادامه می‌یابد.
  • متد lazy:
    1. هر نامه جداگانه آماده شده و ارسال می‌شود.
    2. بعد از ارسال هر نامه حافظه آزاد می‌شود.
    3. سپس، نامه بعدی آماده می‌شود و این فرایند تا پایان ادامه پیدا می‌کند.

متد Upsert در Eloquent لاراول چه کاربردی دارد؟

متد Upsert همان طور که از نامش پیداست، ترکیبی از متدهای Update و Insert است. این متد دو کار را به صورت همزمان انجام می‌دهد.

  • اگر رکورد از قبل در جدول وجود داشت، به‌روزرسانی می‌شود. در واقع، عملیات Update صورت می‌گیرد.
  • اگر رکورد در جدول وجود نداشت، رکورد جدید ساخته می‌شود. در واقع، عملیات Insert صورت می‌گیرد.

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

در مثال بالا ابتدا Eloquent بررسی می‌کند که آیا محصول با فیلدname برابرmobile وجود دارد یا خیر. سپس، در صورت موجود بودن محصول فیلدprice را به‌روزرسانی می‌کند. همچنین، در صورت وجود نداشتن یک محصول جدید با مشخصات ارائه شده می‌سازد. متد Upsert برای حجم بالا داده‌ها کاربرد دارد و در نقطه مقابل برای رکوردهای تکی از متدupdateOrCreate() می‌توان استفاده کرد.

منظور از Pruning Model در Eloquent لاراول چیست؟

Pruning Model یکی از ویژگی‌های جذاب و کاربری Eloquent ORM در لاراول است. به مرور زمان بعد از استفاده مداوم از برنامه حجم داده‌ها و رکوردهای موجود در پایگاه داده افزایش پیدا می‌کند. در نتیجه نیاز است تا برنامه‌نویس به صورت دوره‌ای رکوردهای قدیمی و غیرضروری را از پایگاه داده حذف کند. Pruning Model در لاراول دقیقاً همین کار را انجام می‌دهد.

از جمله مهم‌ترین مزایای Pruning Model در لاراول به موارد زیر می‌توان اشاره کرد.

  • جلوگیری از انباشته شدن داده‌های غیرضروری در پایگاه داده
  • بهبود عملکرد برنامه با کاهش حجم داده‌ها
  • عدم نیاز به نوشتن اسکریپت‌های پاکسازی به صورت دستی

به زبان ساده، همان طور که یک باغ همزمان با رشد گیاهان جدید نیاز به هرس کردن گیاهان قدیمی و خشک شده دارد تا شرایط رشد گیاهان محیا شود. در پایگاه داده نیز باید داده‌های قدیمی و غیرضروری حذف شوند. بر همین اساس Pruning Model نیز همانند یک باغبان به صورت خودکار مسئولیت پاکسازی داده‌های قدیمی و غیرضروری را انجام می‌دهد.

برنامه نویس پشت یک مانیتور بزرگ نشسته است و در حال حذف رکوردهای غیر ضروری با استفاده از Eloquent ORM در لاراول است

مثالی از کاربرد Pruning Model در لاراول

فرض کنید که مدلی با نامLoginLog دارید که لاگ ورود کاربران به برنامه را ذخیره می‌کند. به منظور کاهش حجم داده‌ها می‌خواهید لاگ‌های ورودی که بیش از ۳۰ روز عمر دارند را پاک کنید. برای این منظور باید از Pruning Model استفاده کنید که نحوه پیاده‌سازی آن آورده شده است.

در گام بعدی باید دستور زیر را در کنسول وارد کنید.

php artisan model:prune

با اجرای دستور بالا تمام لاگ‌های ورود با عمر بیش از ۳۰ روز حذف خواهند شد.

چگونه دو مدل در Eloquent لاراول را با یکدیگر مقایسه کنیم؟

گاهی اوقات نیاز است تا یکسان بودن دو مدل در Eloquent بررسی شود. برای این منظور می‌توان از متدهایis وisNot استفاده کرد. این متدها مشخص می‌کنند که آیا ویژگی‌های اصلی مدل نظیر کلید اصلی، جدول، اتصال پایگاه داده یکسان هستند یا خیر. قطعه کد زیر نحوه استفاده از این متدها را نشان می‌دهد.

در مثال بالا مدل$post با$anotherPost به کمک متدis وisNot مقایسه شده است.

مفهوم Event در Eloquent لاراول چیست؟

«رویداد» (Event) به نقاط کلیدی در چرخه حیات یک مدل در Eloquent اشاره دارد. به عنوان مثال، وقوع یک عملیات مانند ایجاد، به‌روزرسانی یا حذف یک رکورد را می‌توان به عنوان یک رویداد در نظر گرفت. Eloquent به توسعه‌دهندگان این امکان را می‌دهد تا در زمان وقوع یک رویداد کدهای دلخواه خود را پیاده‌سازی کنند.

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

انواع Event در Eloquent لاراول

Eventها زمانی رخ می‌دهند که عملیات مشخصی بر روی مدل انجام شود. با استفاده از Eventها می‌توان قبل یا بعد از انجام عملیات بر روی مدل کدهای دلخواهی را پیاده‌سازی کرد. در ادامه مهم‌ترین Eventهای موجود در Eloquent آورده شده است.

  • retrieved: زمانی فراخوانی می‌شود که یک رکورد از پایگاه داده خوانده شود. به عنوان مثال بعد از دریافت اطلاعات یک کاربر از پایگاه داده این رویداد فراخوانی خواهد شد.
  • creating: قبل از ایجاد یک رکورد جدید در پایگاه داده این رویداد فراخوانی می‌شود.
  • created: بلافاصله بعد از ایجاد رکورد جدید در پایگاه داده این رویداد اجرا خواهد شد.
  • updating: این رویداد قبل از به‌روزرسانی یک رکورد موجود اجرا می‌شود.
  • updated: بلافاصله بعد از به‌روزرسانی یک رکورد این رویداد فراخوانی خواهد شد.
  • saving: قبل از ذخیره‌سازی یک رکورد این رویداد اجرا می‌شود.
  • saved: بعد از اتمام ذخیره‌سازی یک رکورد این رویداد فراخوانی خواهد شد.
  • deleting: قبل از حذف رکورد این رویداد فراخوانی می‌شود.
  • deleted: بلافاصله بعد از حذف رکورد این رویداد اجرا خواهد شد.
  • restoring: قبل از بازیابی یک رکورد حذف شده این رویداد فراخوانی می‌شود.
  • restored: بعد از بازیابی کامل یک رکورد حذف شده این رویداد فراخوانی خواهد شد.

چگونه یک Event در Eloquent لاراول تعریف کنیم؟

برای استفاده از رویدادهای موجود در Eloquent باید آن‌ها را در متدbooted() مدل فراخوانی کرد. به عنوان مثال، در قطعه کد زیر رویدادهایcreating وupdated پیاده‌سازی شده‌اند.

در مثال بالا رویدادcreating قبل از ایجاد رکورد جدید و رویدادupdated بعد از به‌روزرسانی رکورد اجرا می‌شوند. بنابراین، قبل از ایجاد رکورد جدید در پایگاه داده فیلدname مربوط به آن اصلاح شده و با تابعucfirst() در PHP حرف اول آن به حروف بزرگ تبدیل می‌شود. همچنین، بعد از به‌روزرسانی رکورد یک لاگ جدید در خروجی ثبت خواهد شد. بر همین اساس با استفاده از Eventها در Eloquent می‌توان عملیاتی را به صورت خودکار بر روی پایگاه داده پیاده‌سازی کرد که این مورد موجب انعطاف‌پذیری بیشتر برنامه خواهد شد.

کاربرد Observer در Eloquent لاراول چیست؟

Observerها در Eloquent کلاس‌هایی هستند که به رویدادهای اتفاق افتاده بر روی مدل گوش می‌دهند و بر اساس آن کاری انجام می‌دهند. به عنوان مثال، همزمان با ایجاد، به‌روزرسانی یا حذف یک رکورد کدهای نوشته شده در کلاس Observer به صورت خودکار اجرا خواهند شد.

چرا باید از Observer استفاده کرد؟

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

چگونه یک کلاس Observer در لاراول ایجاد کنیم؟

به منظور ایجاد کلاس Observer کافی است تا دستور زیر را در ترمینال وارد کنید.

php artisan make:observer UserObserver --model=User

با اجرای دستور بالا کلاسUserObserver برای مدلUser ایجاد خواهد شد. این کلاس در مسیرapp/Observers/ قابل دسترسی است. سپس باید در این کلاس متدهایی را برای رویدادهای مختلف تعریف کرد.

در مثال بالا توابعcreating وupdated برای کلاسUserObserver تعریف شده‌اند که به ترتیب در زمان ایجاد رکورد جدید و به‌روزرسانی رکورد اجرا می‌شوند. به عنوان گام نهایی باید ارتباط کلاسObserver و مدل را برقرار کنید. قطعه کد زیر نحوه انجام این کار را نشان می‌دهد.

در مجموع استفاده از کلاس Observer باعث می‌شود که کد اصلی مدل خواناتر باشد و راحت‌تر سازماندهی شود.

منظور از Closure در Eloquent لاراول چیست؟

Closure یک تابع ناشناس (بدون نام) است که به صورت مستقیم در کد تعریف می‌شود. قطعه کد زیر نحوه تعریف Closure در لاراول را نشان می‌دهد.

از این نوع تابع در لاراول به منظور پیاده‌سازی کارهای سریع و ساده بعد از وقوع رویدادهای مدل مانند ایجاد یا به‌روزرسانی استفاده می‌شود. قطعه کد زیر مثالی از کاربرد Closure در لاراول را نشان می‌دهد.

در مثال بالا از Closure در لاراول برای پیاده‌سازی عملکرد مربوط به رویدادcreating استفاده شده است. استفاده از Closure باعث می‌شود که کد نوشته شده مرتب‌تر و خواناتر باشد، زیرا دیگر نیازی به تعریف توابع مجزا وجود ندارد.

چگونه زبان PHP را یاد بگیریم؟

PHP یکی از پرکاربردترین زبان‌های برنامه نویسی در حوزه توسعه وب است که بسیاری از وب‌سایت‌ها و سیستم‌های مدیریت محتوا معروف همچون وردپرس بر مبنای این زبان برنامه نویسی ساخته شده‌اند. با توجه به کاربردهای متعدد و بازار کار خوب PHP یادگیری این زبان برنامه نویسی می‌تواند فرصت‌های شغلی متعددی را برای شما به ارمغان بیاورد.

اگر قصد یادگیری زبان برنامه نویسی PHP را دارید، به منظور کسب بهترین نتیجه نیاز است تا یک نقشه راه یادگیری برای این زبان برنامه نویسی داشته باشید. به عنوان مثال می‌توانید مراحل زیر را برای یادگیری دنبال کنید.

  • آشنایی با مفاهیم پایه PHP نظیر متغیر، عملگر و توابع
  • کار با دیتابیس و MySQL
  • انجام چند پروژه ساده به صورت عملی
  • استفاده از فریمورک‌های معروف نظیر لاراول

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

در این مجموعه فیلم‌های آموزشی در سطوح مختلف از مقدماتی تا پیشرفته منتشر شده است که در ادامه تعدادی از دوره‌های پیشنهادی موجود در این مجموعه آورده شده است.

مجموعه فیلم‌های آموزش‌ برنامه نویسی پی اچ پی PHP – مقدماتی تا پیشرفته فرادرس
برای مشاهده مجموعه فیلم‌های آموزش‌ برنامه نویسی پی اچ پی PHP – مقدماتی تا پیشرفته فرادرس، بر روی تصویر کلیک کنید.

برای مشاهده مجموعه فیلم‌های آموزش‌ برنامه نویسی پی اچ پی PHP – مقدماتی تا پیشرفته فرادرس، بر روی تصویر کلیک کنید.

جمع‌بندی

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

علاوه بر این، با خواندن این نوشته نحوه ایجاد مدل، کار با داده‌ها، ارتباط بین مدل‌ها، کار با Eventها، متدها و بسیاری دیگر از ویژگی‌های Eloquent را یاد گرفتید. بدون شک استفاده از Eloquent در لاراول نگاه شما به توسعه وب را تغییر خواهد داد.

source

توسط expressjs.ir