40 نکته راجب ORM Eloquent - کم استفاده اما فوق العاده کاربردی

پوریا سبحانلو

پوریا سبحانلو

01 مرداد 1403
دقیقه 6
40 نکته راجب  ORM Eloquent - کم استفاده اما فوق العاده کاربردی
laravelormeloquent

اول اینکه ما چقد Eloquent رو میشناسیم.

Eloquent  یکی از ORM قوی که اجازه میده به برنامه نویس که ارتباط  syntax راحت تری بتونه با دیتابیس برقرار کنه.

متد های مثل  find() where() first() save() که کار هر برنامه نویسی رو برای توسعه راحت تر میکنه.

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

 

1 -  متد tap()

چرا: اعمال تغییرات در یک مدل و برگرداندن خود مدل برای زنجیره متد.

وقتی:  زمانی که می خواهید یک شی را تغییر دهید از آن استفاده کنید و بلافاصله از آن در عملیات دیگری استفاده کنید.

User::find(1)->tap(function ($user) {
    $user->name = 'Updated Name';
})->save();

 

2 -  متد  firstOrFail()
چرا: برای اطمینان از دریافت یک نتیجه معتبر یا رسیدگی به پرونده ای که هیچ نتیجه ای پیدا نشده است.

وقتی: زمانی که نیاز به واکشی یک رکورد خاص دارید و می خواهید در صورت عدم وجود آن خطای 404 ایجاد کنید، از آن استفاده کنید.

$user = User::where('email', 'example@example.com')->firstOrFail();
// Process user details

 

3 - متد  updateOrCreate()
چرا: برای جلوگیری از ورودی های تکراری با به روز رسانی یک رکورد موجود یا ایجاد یک رکورد جدید.

وقتی: زمانی از آن استفاده کنید که می‌خواهید مطمئن شوید رکوردی وجود ندارد یا اگر وجود داره به‌روزرسانی می‌شود.

 

User::updateOrCreate(
   ['email' => 'example@example.com'],
   ['name' => 'John Doe']
);

 

4 - increment() / decrement()
یکی از باحالترین متد هاست به نظرم و واقعا کاربردی. چه زمانی از آن استفاده می کنید؟
وقتی: از آن برای افزایش یا کاهش یک یا چند ستون عددی استفاده کنید.

چرا: برای به روز رسانی موثر مقدار یک ستون عددی.

User::where('id', 1)->increment('points'); // if points is 7, it will now be 8
User::where('id', 1)->decrement('points', 5); // if 7, it will become 2

 

5. withTrashed() / onlyTrashed() / restore()
این گروه از روش ها برای مدیریت ویژگی Soft Deletes در لاراول استفاده می شوند.
چرا: برای مدیریت رکوردهای پاک شده اگر به صورت  Soft Deletes باشد.
وقتی: از این روش‌ها برای دریافت کاربران پاک شده یا برگرداندن آنها استفاده میشود.

$users = User::withTrashed()->get();
$trashedUsers = User::onlyTrashed()->get();
User::withTrashed()->where('id', 1)->restore();

 

6. بدون رویداد ()

چرا: برای جلوگیری از اجرای رویداد ها (event listeners)

وقتی: هنگام انجام اقداماتی که نباید باعث ایجاد Event شوند، از آن استفاده کنید، مانند ذخیره دسته ای یک سری مقادیر.

فرض کنید تعداد زیادی کاربر را به صورت دستی Import می‌کنید و نمی‌خواهید رویداد UserCreated را برای هر کاربر وارد شده فعال کنید تا از ارسال ایمیل‌های خوش‌آمدگویی یا ثبت Event جلوگیری کنید.

User::withoutEvents(function () {
   User::create([
     'name' => 'John Doe', 
     'email' => 'john@example.com'
   ]);
   User::create([
     'name' => 'Jane Doe', 
     'email' => 'jane@example.com'
   ]);
});

7. بدون ()GlobalScopes
چرا: برای دور زدن یا حذف GlobalScope ها.
کی: زمانی که شما یه شرط ثابت برای هر پرس و جودارید اینجوری میتونید اون رو حذف کنید و داده ها رو کامل بگیرید. برای مثلا شرط is_published. true برای تمام Post ها

سناریویی را در نظر بگیرید که در آن برنامه شما دارای یک مدل Post با GlobalScope  است که فقط شامل پست هایی است که منتشر می شوند. ممکن است یک Admin برای پنل مدیریت، نیاز داشته باشید که همه پست‌ها، از جمله پیش‌نویس‌ها و پست‌های منتشر نشده را ببیند.

واکشی همه پست‌ها با نادیده گرفتن GlobalScope  :


در این مثال، بدون ()GlobalScopes به ادمین اجازه می‌دهد تا همه پست‌ها را مشاهده کند، و از GlobalScope   که پست‌های منتشر نشده را فیلتر می‌کند دور می‌زند.

استفاده از ()بدونGlobalScopes به ویژه در کارهای اداری که دسترسی جامع به داده ها مورد نیاز است، یا در هنگام اشکال زدایی و آزمایش زمانی که نیاز دارید اطمینان حاصل کنید که محدودیت های جهانی بر جستارهای شما تأثیر نمی گذارد، مفید است.

10. is() / isNot()
چرا: برای مقایسه دو نمونه مدل.
وقتی: از آن برای بررسی اینکه آیا دو مدل نمونه مشابه هستند استفاده کنید.

11. loadMissing()
مثال: فرض کنید یک مدل کاربری دارید که رابطه پست‌ها دارد. می‌خواهید کاربر را همراه با پست‌هایش بارگیری کنید، اما مطمئن نیستید که رابطه پست‌ها قبلاً بارگذاری شده است یا خیر.

چرا: برای بارگذاری مشروط روابط مشتاق که قبلاً بارگذاری نشده‌اند، بهینه‌سازی کوئری‌های پایگاه داده و اجتناب از مشکل پرس و جو N+1.

When: زمانی که می خواهید روابط را روی نمونه مدل بارگیری کنید، از loadMissing() استفاده کنید اما فقط در صورتی که قبلاً بارگذاری نشده باشند. این به ویژه زمانی مفید است که روابط شرطی دارید که می خواهید به صورت پویا بر اساس شرایط خاص بارگیری کنید یا زمانی که روابط را در یک حلقه بارگیری می کنید که ممکن است برخی از آنها قبلاً بارگذاری شده باشند.


12. makeHidden() / makeVisible()
چرا: برای کنترل نمایان بودن ویژگی های مدل.
When: از آن برای پنهان کردن یا نمایش موقت ویژگی ها، به عنوان مثال، در پاسخ های API استفاده کنید.


13. touch()
چرا: برای به روز رسانی timestamp updated_at.
When: از آن برای علامت گذاری رکورد به عنوان به روز شده بدون تغییر هیچ ویژگی دیگری استفاده کنید.

14. append()
چرا: برای افزودن ویژگی های سفارشی به آرایه مدل یا فرم JSON.
When: زمانی که می‌خواهید ویژگی‌های محاسبه‌شده اضافی را در نمایش مدل اضافه کنید، از آن استفاده کنید.

من یک آموزش بسیار جامع و گام به گام در مورد نحوه مدیریت Json Data در لاراول نوشته ام.

نحوه مدیریت داده های JSON در لاراول با ستون های Eloquent و JSON: راهنمای کامل 2023
در برنامه‌های کاربردی وب مدرن، داده‌ها اغلب به شکل JSON (نشان‌گذاری شی جاوا اسکریپت) هستند. JSON یک داده همه کاره است…
medium.com

15. replicate()
چرا: برای کپی کردن یک نمونه مدل.
When: از آن برای ایجاد یک نمونه جدید با همان ویژگی ها، مانند شبیه سازی یک الگو، استفاده کنید.

16. chunkById()
تصور کنید با جدولی با 20000000 رکورد سروکار دارید و باید روی هر رکورد اقدام کنید. چگونه این کار را بدون ….

چرا: برای پردازش کارآمد مجموعه داده های بزرگ در تکه ها.
زمان: از آن برای پردازش مجموعه داده های بزرگ برای مدیریت کارآمد حافظه با عملکرد بهتر در جداول بزرگ استفاده کنید.

فرض کنید یک جدول پایگاه داده با 20000000 رکورد دارید و باید روی هر رکورد یک عمل مشخص انجام دهید.


نکته: متد مشابهی به نام chunk() وجود دارد. آنها کارهای مشابهی انجام می دهند، اما تفاوت هایی وجود دارد.
هر دو chunk() و chunkById() برای پردازش مجموعه داده های بزرگ به طور موثر در دسته ها استفاده می شوند که از فرسودگی حافظه و بهینه سازی عملکرد جلوگیری می کند. هر دوی آنها به شما این امکان را می دهند که روی یک مجموعه داده بزرگ بدون بارگیری کل مجموعه داده به یکباره در حافظه، تکرار کنید. با این حال، آنها در نحوه تعیین دسته های داده متفاوت هستند:

chunk():

chunk() مجموعه داده را بر اساس تعداد رکوردها در هر قطعه که به عنوان پارامتر اول مشخص شده است به قطعات تقسیم می کند.
این رکوردها را از جدول پایگاه داده به صورت متوالی و بدون در نظر گرفتن ترتیب خاصی بازیابی می کند.
رکوردها در هر تکه بر اساس ترتیبی که از پایگاه داده بازیابی شده اند واکشی می شوند، که ممکن است لزوما بر اساس ترتیب کلید اولیه نباشد.
این روش زمانی مفید است که ترتیب پردازش مهم نیست، یا زمانی که شما به سادگی نیاز به پردازش داده ها در قطعات کوچکتر و قابل مدیریت دارید.
chunkById():

chunkById() مجموعه داده را بر اساس ترتیب کلید اولیه (معمولا id) رکوردها به تکه هایی تقسیم می کند.
این رکوردها را از جدول پایگاه داده به ترتیب بر اساس ترتیب کلیدهای اصلی آنها بازیابی می کند.
هر تکه حاوی رکوردهایی با کلیدهای اصلی در محدوده مشخصی است که اطمینان حاصل می کند که رکوردها به ترتیب کلیدهای اصلی خود پردازش می شوند.
این روش به ویژه زمانی مفید است که ترتیب پردازش مهم است، مانند هنگام انجام انتقال داده ها یا به روز رسانی هایی که نیاز به پردازش متوالی بر اساس ترتیب کلید اولیه دارند.
17. existsOr()
چرا: برای اجرای یک فراخوان در صورت وجود مدل، یا برگرداندن یک مقدار پیش فرض.
When: از آن برای رسیدگی به بررسی های موجود با منطق سفارشی استفاده کنید.

18. firstOrCreate()
چرا: برای بازیابی یا ایجاد یک رکورد در یک مرحله.
وقتی: از آن برای جلوگیری از ورودی های تکراری با به روز رسانی یا ایجاد رکورد در صورت نیاز استفاده کنید.


19. firstOrNew()
چرا: برای بازیابی یا نمونه سازی یک رکورد جدید بدون ذخیره کردن.
زمان: از آن برای دریافت موجودی استفاده کنید

 

 

 

 

 

 


پوریا سبحانلو

پوریا سبحانلو

سلام من پوریام

یه php کاری که ریز نگاهی هم به فریم ورک های js داره


admoon من اینجام

اینارو هم یه نگاه بنداز