| کانال توسعه‌دهندگان لاراول |
1.62K subscribers
54 photos
114 links
⭕️ کانال توسعه‌دهندگان لاراول دولوپیکس

💠 دولوپیکس | جامعه توسعه‌دهندگان ایرانی

💎 @Developix
🚀 Developix.ir

📌 پشتیبانی و تبلیغات:
@DevelopixSupport
Download Telegram
فصل چهار - مدل‌ها و Eloquent ORM

بخش دوم - مدل ها - قسمت نهم (متدهای گروهبندی و بارگذاری)


1- متد groupBy
برای گروه‌بندی نتایج بر اساس یک یا چند ستون استفاده می‌شود. این متد می‌تواند داده‌ها را بر اساس مقادیر مشابه در ستون‌های مشخص گروه‌بندی کند.
$users = User::select('status')
->groupBy('status')
->get();

این کوئری کاربران را بر اساس ستون status گروه‌بندی می‌کند.

2- متد havingRaw
برای اعمال شرط‌ها بر روی نتایج گروه‌بندی‌شده استفاده می‌شود. این متد به شما اجازه می‌دهد که بر روی داده‌های گروه‌بندی‌شده شرط خاصی اعمال کنید.
$users = User::select('status', \DB::raw('COUNT(*) as user_count'))
->groupBy('status')
->havingRaw('COUNT(*) > 5')
->get();

این کوئری کاربران را بر اساس status گروه‌بندی می‌کند و فقط گروه‌هایی را نمایش می‌دهد که تعداد کاربرانشان بیشتر از ۵ نفر باشد.

3- متد orHavingRaw
مشابه havingRaw است، اما به شما اجازه می‌دهد که از شرط‌های OR استفاده کنید.
$users = User::select('status', \DB::raw('COUNT(*) as user_count'))
->groupBy('status')
->havingRaw('COUNT(*) > 5')
->orHavingRaw('COUNT(*) = 2')
->get();

این کوئری کاربران را بر اساس status گروه‌بندی می‌کند و وضعیت‌هایی را نمایش می‌دهد که یا تعداد کاربران بیشتر از ۵ باشد یا دقیقا ۳ کاربر داشته باشند.

4- متد groupByRaw
برای گروه‌بندی نتایج با استفاده از عبارات خام SQL استفاده می‌شود.
$users = User::selectRaw('YEAR(created_at) as year, COUNT(*) as total')
->groupByRaw('YEAR(created_at)')
->get();

این کوئری کاربران را بر اساس سال ثبت‌نام (created_at) گروه‌بندی می‌کند و تعداد کاربران ثبت‌شده در هر سال را برمی‌گرداند.

5- متد union
برای ترکیب دو کوئری مختلف استفاده می‌شود. این متد نتایج دو کوئری را در یک مجموعه واحد ترکیب می‌کند و مقادیر تکراری را حذف می‌کند.
$firstQuery = User::select('name')->where('status', 'active');
$secondQuery = User::select('name')->where('status', 'inactive');

$users = $firstQuery->union($secondQuery)->get();

این کوئری نام‌های کاربران با وضعیت active و inactive را ترکیب می‌کند و نتیجه را بدون مقادیر تکراری برمی‌گرداند.

6- متد unionAll
مشابه union است، اما برخلاف union، تمام نتایج دو کوئری را (حتی مقادیر تکراری) برمی‌گرداند.
$firstQuery = User::select('name')->where('status', 'active');
$secondQuery = User::select('name')->where('status', 'inactive');

$users = $firstQuery->unionAll($secondQuery)->get();

این کوئری نام‌های کاربران با وضعیت active و inactive را ترکیب می‌کند، اما برخلاف union، تمام نتایج (حتی مقادیر تکراری) را برمی‌گرداند.

7- متد chunk
مجموعه‌ای از رکوردها را به بخش‌های کوچکتر تقسیم می‌کند و برای هر بخش یک تابع فراخوانی می‌کند.
User::chunk(100, function ($users) {
foreach ($users as $user) {
//
}
});

این کد کاربران را به دسته‌های ۱۰۰ تایی تقسیم می‌کند و به صورت جداگانه برای هر دسته تابعی را اجرا می‌کند. برای هر دسته ۱۰۰ کاربر، تابع تعریف‌شده فراخوانی می‌شود.

8- متد chunkById
این متد به صورت ویژه بر اساس id رکوردها بخش‌بندی می‌کند. این متد برای پردازش حجم زیادی از داده‌ها بدون نگرانی از تغییر یا حذف رکوردهای قبل از پردازش مفید است.

9- متد each
برای اجرای یک تابع روی هر رکورد به صورت جداگانه استفاده می‌شود. این متد اغلب به همراه متدهایی مانند lazy استفاده می‌شود.
User::chunk(100, function ($users) {
$users->each(function ($user) {
//
});
});

این کد ابتدا کاربران را به دسته‌های ۱۰۰ تایی تقسیم می‌کند و سپس هر کاربر را جداگانه پردازش می‌کند.

10- متد lazy
داده‌ها را به صورت تدریجی و در لحظه (به جای لود کامل) بازیابی می‌کند. این متد کارآمدتر از get() برای مجموعه داده‌های بزرگ است، چرا که همه رکوردها را همزمان در حافظه بارگذاری نمی‌کند.
User::lazy()->each(function ($user) {
//
});

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

11- متد lazyById
مشابه lazy است، اما داده‌ها را بر اساس ستون id به صورت تدریجی بارگذاری می‌کند. این متد تضمین می‌کند که داده‌ها به صورت امن بر اساس id مرتب شده و بارگذاری می‌شوند.

12- متد lazyByIdDesc
مانند lazyById است، اما رکوردها را به صورت نزولی بر اساس id بارگذاری می‌کند.

🔖 #Laravel, #PHP, #لاراول, #فصل_۴

👤 AmirHossein

💎 Channel: @DevelopixLaravel
3👍3
فصل چهار - مدل‌ها و Eloquent ORM

بخش دوم - مدل ها - قسمت دهم
(متد های صفحه بندی)

1- متد paginate
نتایج جستجو را به صورت صفحه‌بندی‌شده برمی‌گرداند و شامل اطلاعات کامل در مورد صفحات، لینک‌های صفحات و تعداد کل رکوردها است. این متد تعداد کل رکوردها را محاسبه می‌کند، بنابراین ممکن است برای دیتابیس‌های بزرگتر کمی سنگین باشد.
$users = User::paginate(10);

این کوئری ۱۰ کاربر در هر صفحه را بازیابی می‌کند. به صورت پیش‌فرض، لاراول لینک‌های صفحه‌بندی را بر اساس تعداد کل رکوردها نمایش می‌دهد.

2- متد simplePaginate
مشابه paginate است، اما تعداد کل رکوردها را محاسبه نمی‌کند. این متد از لینک‌های next و previous برای صفحه‌بندی استفاده می‌کند، بنابراین سبک‌تر است و برای مجموعه داده‌های بزرگ مناسب‌تر است.
$users = User::simplePaginate(10);

این کوئری ۱۰ کاربر در هر صفحه را بازیابی می‌کند و فقط لینک‌های "صفحه بعد" و "صفحه قبل" را ارائه می‌دهد، بدون محاسبه تعداد کل صفحات یا رکوردها.

3- متد cursorPaginate
یک روش سبک و بهینه‌تر برای صفحه‌بندی است که از شناسه‌های منحصر به فرد (cursor) برای مدیریت صفحه‌بندی استفاده می‌کند. برخلاف paginate و simplePaginate، این متد نیازی به شمارش کل رکوردها ندارد و برای مجموعه داده‌های بسیار بزرگ مناسب است. این نوع صفحه‌بندی برای مواقعی که نیاز به بارگذاری سریع دارید، استفاده می‌شود.
$users = User::cursorPaginate(10);

این کوئری ۱۰ کاربر در هر صفحه را با استفاده از شناسه‌های cursor بازیابی می‌کند، و به صورت کارآمد‌تر صفحه‌بندی انجام می‌دهد.

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

1- دریافت شماره صفحه جاری.
$users->currentPage()


2- لینک به صفحه بعد.
$users->nextPageUrl()


3- لینک به صفحه قبل.
$users->previousPageUrl()


4- تعداد رکوردهایی که در هر صفحه نمایش داده می‌شود.
$users->perPage()


5- تعداد کل رکوردها. در simplePaginate در دسترس نیست.
$users->total()


6- شماره آخرین صفحه. در simplePaginate در دسترس نیست.
$users->lastPage()


7- لینک به صفحه خاص
$users->url(3)


8- تعداد رکوردهای فعلی در صفحه جاری.
$users->count()


9- بررسی می‌کند که آیا صفحات بیشتری وجود دارد یا خیر. در دسترس از cursorPaginate.
$users->hasMorePages()


10- شناسه cursor صفحه جاری که برای پیمایش صفحات بعدی و قبلی استفاده می‌شود. در دسترس از cursorPaginate.
$users->cursor()


11- دریافت UI و لینک های صفحه بندی.
$users->links()


🔖 #Laravel, #PHP, #لاراول, #فصل_۴

👤 AmirHossein

💎 Channel: @DevelopixLaravel
👍42
فصل چهار - مدل‌ها و Eloquent ORM

بخش دوم - مدل ها - قسمت یازدهم


1- متد table
برای انجام کوئری‌ها روی جداول دلخواه در پایگاه داده استفاده می‌شود. معمولاً از این متد زمانی استفاده می‌شود که نمی‌خواهید یا نمی‌توانید از مدل‌های Eloquent استفاده کنید.
$users = DB::table('users')->get();

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

2- متد isDirty
بررسی می‌کند که آیا مقدار یک یا چند فیلد از مدل تغییر کرده است یا خیر. این متد به شما کمک می‌کند تا قبل از ذخیره‌سازی یک مدل، متوجه شوید که کدام فیلدها تغییر کرده‌اند.
$user = User::find(1);
$user->name = 'John Doe';

if ($user->isDirty('name')) {
echo 'Name has been changed!';
}

این کد بررسی می‌کند که آیا فیلد name در مدل User تغییر کرده است یا خیر. اگر تغییر کرده باشد، پیامی چاپ می‌کند.

3- متد isClean
برعکس isDirty است و بررسی می‌کند که آیا هیچ تغییری در مدل رخ نداده است. این متد بررسی می‌کند که آیا هیچ یک از فیلدهای مدل تغییر نکرده‌اند.

4- متد wasChanged
بررسی می‌کند که آیا فیلد یا فیلدهایی پس از ذخیره‌سازی مدل در پایگاه داده تغییر کرده‌اند یا خیر. این متد معمولاً پس از ذخیره‌سازی مدل (save()) استفاده می‌شود.

5- متد getOriginal
مقدار اصلی یک فیلد را پیش از تغییر و ذخیره‌سازی مدل در پایگاه داده برمی‌گرداند. این متد می‌تواند قبل یا بعد از ذخیره مدل استفاده شود.
$user = User::find(1);
echo $user->getOriginal('name');

$user->name = 'John Doe';
echo $user->getOriginal('name'); // Same

این کد مقدار اولیه فیلد name را پیش از هر تغییری نمایش می‌دهد، حتی اگر فیلد تغییر کرده باشد، همچنان مقدار اصلی را نشان می‌دهد.

6- متد sharedLock
برای جلوگیری از تغییر داده‌های انتخاب‌شده در یک کوئری توسط سایر تراکنش‌ها استفاده می‌شود، اما به سایر تراکنش‌ها اجازه خواندن این داده‌ها را می‌دهد. این نوع قفل را "قفل اشتراکی" می‌نامند. این متد برای محافظت از داده‌ها در برابر تغییرات ناگهانی در حین انجام تراکنش‌ها مفید است.
$users = User::where('active', 1)
->sharedLock()
->get();

این کد تمام کاربران فعال را با یک قفل اشتراکی انتخاب می‌کند. این کاربران نمی‌توانند در طول این تراکنش تغییر کنند، اما سایر تراکنش‌ها همچنان می‌توانند آن‌ها را بخوانند.

7- متد lockForUpdate
برای اعمال قفل به‌روزرسانی روی رکوردها استفاده می‌شود. برخلاف sharedLock، این نوع قفل تنها به یک تراکنش اجازه به‌روزرسانی رکوردهای انتخاب‌شده را می‌دهد و سایر تراکنش‌ها نمی‌توانند این رکوردها را تا زمانی که قفل آزاد نشود تغییر یا حتی بخوانند.
$users = User::where('active', 1)
->lockForUpdate()
->get();

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

8- متد fresh
برای بازیابی آخرین نسخه یک رکورد از پایگاه داده استفاده می‌شود. این متد مدل فعلی را از پایگاه داده تازه‌سازی کرده و تغییرات جدیدی که در پایگاه داده ثبت شده‌اند را نشان می‌دهد.
$user = User::find(1);
$user->name = 'John';
$user->fresh();

این متد مدل User را دوباره از پایگاه داده بارگذاری می‌کند، بنابراین هر تغییری که در مدل انجام‌شده اما ذخیره نشده است، بازنویسی خواهد شد.

9- متد refresh
مشابه fresh است، اما علاوه بر تازه‌سازی مدل از پایگاه داده، روابط (relationships) مربوط به مدل را نیز بازنویسی می‌کند. اگر مدل دارای روابطی باشد، refresh آن‌ها را نیز دوباره از پایگاه داده بازیابی می‌کند.
$user = User::with('posts')->find(1);
$user->name = 'John';
$user->refresh();

این کد مدل User را همراه با روابط آن (مانند posts) از پایگاه داده مجدداً بازیابی می‌کند. هر تغییری که ذخیره نشده باشد، از بین می‌رود و اطلاعات از پایگاه داده مجدداً بارگذاری می‌شود.

10- متد withoutGlobalScope
به شما امکان می‌دهد یک یا چند Global Scope اعمال‌شده روی مدل‌ها را به‌صورت موقت غیرفعال کنید. در لاراول، Global Scope ها می‌توانند به صورت پیش‌فرض برای همه کوئری‌های یک مدل اعمال شوند. با این متد می‌توانید این محدودیت‌ها را کنار بگذارید.
قابلیت Global Scope در لاراول به یک محدودیت یا شرط کلی گفته می‌شود که به صورت خودکار برای تمامی کوئری‌های یک مدل اعمال می‌شود.
$users = User::withoutGlobalScope('active')->get(); // Test query

این کوئری کاربران را بدون اعمال Global Scope مربوط به کاربران فعال بازمی‌گرداند.

از قسمت بعد به آشنایی با روابط و متد های آنها می پردازیم.

🔖 #Laravel, #PHP, #لاراول, #فصل_۴

👤 AmirHossein

💎 Channel: @DevelopixLaravel
4👍1
فصل چهار - مدل‌ها و Eloquent ORM

بخش دوم - مدل ها - قسمت دوازدهم (آشنایی با روابط)


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

انواع روابط:

1- رابطه One-to-One (یک به یک):
در این نوع رابطه، هر رکورد از یک جدول فقط به یک رکورد از جدول دیگر مرتبط است.

مثال:
هر کاربر فقط یک پروفایل دارد.

2- رابطه One-to-Many (یک به چند):
در این نوع رابطه، هر رکورد از یک جدول می‌تواند به چندین رکورد از جدول دیگر مرتبط باشد.

مثال:
هر پست می‌تواند چندین نظر داشته باشد.

3- رابطه Many-to-One (چند به یک):
این رابطه در واقع برعکس One-to-Many است. چند رکورد از جدول دوم به یک رکورد در جدول اول مرتبط است.

مثال:
چند نظر به یک پست تعلق دارد.

4- رابطه Many-to-Many (چند به چند):
در این نوع رابطه، هر رکورد از یک جدول می‌تواند به چندین رکورد از جدول دیگر مرتبط باشد و بالعکس. این نوع رابطه از طریق یک جدول واسط (pivot table) مدیریت می‌شود.

مثال:
هر کاربر می‌تواند چندین نقش داشته باشد و هر نقش به چندین کاربر اختصاص داده شده باشد.

5- رابطه Has-Many-Through (چندین رکورد از طریق یک رابطه واسط):
این نوع رابطه به شما امکان می‌دهد که رکوردهای یک جدول را از طریق رابطه‌ای با یک جدول واسط بازیابی کنید.

مثال:
هر شهر می‌تواند چندین دکتر از طریق بیمارستان‌ها داشته باشد.

6- رابطه Polymorphic Relationships (روابط چندشکلی):
این نوع رابطه به شما امکان می‌دهد که یک مدل به چندین مدل دیگر مرتبط باشد.

مثال:
یک عکس می‌تواند به یک پست یا به یک کاربر مربوط باشد.

مثال ساده از رابطه یک به یک (One-to-One)

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

مدل User:
class User extends Model
{
public function profile()
{
return $this->hasOne(Profile::class);
}
}

متد profile نشان می دهد که هر کاربر یک پروفایل دارد.

مدل Profile:
class Profile extends Model
{
public function user()
{
return $this->belongsTo(User::class);
}
}

متد user نشان می دهد که هر پروفایل متعلق به یک کاربر است.

نکته: جدول profiles دارای ستونی به نام user_id است که کلید خارجی (foreign key) به جدول users می‌باشد.

استفاده از رابطه در کد:

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

بدون رابطه:
برای بازیابی پروفایل کاربر به صورت دستی باید کوئری پیچیده‌تری بنویسید:
$user = User::find(1);
$profile = Profile::where('user_id', $user->id)->first();


با رابطه یک به یک:
اما با استفاده از رابطه، کار شما بسیار ساده‌تر و خواناتر می‌شود:
$user = User::find(1);
$profile = $user->profile;

پراپرتی profile در کد بالا درواقع همان متد profile است که در مدل User تعریف کرده ایم.

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

🔖 #Laravel, #PHP, #لاراول, #فصل_۴

👤 AmirHossein

💎 Channel: @DevelopixLaravel
4👍1
فصل چهار - مدل‌ها و Eloquent ORM

بخش سوم - روابط - قسمت اول


رابطه یک به یک (One-to-One)

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

به عنوان مثال:
- هر کاربر دارای یک پروفایل منحصر به فرد است.
- هر مشتری ممکن است فقط یک آدرس داشته باشد.
- هر کارمند ممکن است فقط یک کارت شناسایی داشته باشد.

1- ساختار جداول:
برای پیاده‌سازی این نوع رابطه در پایگاه داده، شما به دو جدول نیاز دارید. یک جدول اصلی و یک جدول وابسته که از یک کلید خارجی (foreign key) برای برقراری ارتباط استفاده می‌کند.

مثال:
جدول users اطلاعات کاربران را نگهداری می‌کند و دارای یک فیلد id به صورت primary key در کنار سایر فیلد ها.
جدول profiles پروفایل کاربران را نگهداری می‌کند و دارای یک کلید خارجی به نام user_id است که به فیلد id جدول users مرتبط است.


2- ایجاد مدل‌ها:
هر جدول در پایگاه داده با یک مدل Eloquent در لاراول نمایش داده می‌شود.

برای تعریف رابطه یک به یک (One-to-One) در لاراول، از متدهای hasOne و belongsTo استفاده می‌شود.

1- متد hasOne
برای تعریف رابطه "یک به یک" استفاده می‌شود، جایی که یک مدل صاحب (owning) یک رکورد از مدل دیگر است.
// User Model
public function profile()
{
return $this->hasOne(Profile::class);
}

این کد به این معناست که هر User دارای یک Profile است.

پارامترها:

1- مدل مربوطه - الزامی
این پارامتر تعیین می‌کند که مدل مربوطه چیست. در اینجا مدل Profile مرتبط با User است.

2- کلید خارجی - اختیاری
نام ستونی که به عنوان کلید خارجی در جدول Profile ذخیره شده است. اگر این پارامتر تعیین نشود، لاراول به‌طور پیش‌فرض نام مدل والد را با پسوند _id در نظر می‌گیرد. برای مثال، به‌طور پیش‌فرض کلید خارجی در جدول profiles به صورت user_id در نظر گرفته می‌شود.

3- کلید محلی - اختیاری
ستونی که در مدل والد به عنوان کلید محلی برای رابطه استفاده می‌شود. به‌طور پیش‌فرض، این کلید، id است. اگر کلید محلی شما ستون دیگری است، می‌توانید آن را مشخص کنید.
———
2- متد belongsTo
برای تعریف رابطه‌ای استفاده می‌شود که در آن یک مدل متعلق به مدل دیگری است. این متد معمولاً در سمت جدول فرزند (مثلاً Profile) برای اشاره به مدل والد (مثلاً User) استفاده می‌شود.
// Profile Model
public function user()
{
return $this->belongsTo(User::class);
}

این کد به این معناست که هر پروفایل متعلق به یک کاربر است.

پارامترها:

1- مدل مربوطه - الزامی
این پارامتر مدل والد را مشخص می‌کند. در اینجا مدل User با مدل Profile مرتبط است.

2- کلید خارجی - اختیاری
نام ستونی که به عنوان کلید خارجی در جدول فعلی (در این مثال profiles) استفاده می‌شود. اگر این پارامتر تعیین نشود، لاراول به‌طور پیش‌فرض نام مدل والد را با پسوند _id در نظر می‌گیرد، به عنوان مثال user_id.

3- کلید والد - اختیاری
ستونی که در مدل والد به عنوان کلید منحصر به فرد استفاده می‌شود. به‌طور پیش‌فرض، این کلید id است. اگر کلید والد شما ستونی غیر از id است، می‌توانید آن را تعیین کنید.
———
3- پیاده‌سازی رابطه:
پس از تعریف رابطه در مدل‌ها، شما می‌توانید به راحتی به داده‌های مرتبط دسترسی داشته باشید.
$user = User::find(1);
$profile = $user->profile;
// OR
$profile = Profile::find(1);
$user = $profile->user;

پراپرتی های فراخوانی شده دقیقا هم نام با متد هایی است که در مدل تعریف کرده ایم.

4- درج داده‌ها در جداول مرتبط:
$user = User::find(1);
$profile = new Profile([
'bio' => 'Full-Stack Developer'
]);

$user->profile()->save($profile);

ابتدا کاربر با شناسه 1 را پیدا می‌کنیم. سپس یک پروفایل جدید برای آن کاربر ایجاد می‌کنیم. در نهایت از متد save() استفاده می‌کنیم تا پروفایل به طور خودکار با کلید خارجی (user_id) به کاربر مرتبط شود.

5- به‌روزرسانی داده‌ها:
$user = User::find(1);
$user->profile->bio = 'Updated Bio';
$user->profile->save();

فیلد bio در پروفایل کاربر را تغییر می‌دهیم. در نهایت تغییرات را با save() ذخیره می‌کنیم.

به طور کلی با فراخوانی رابطه از طریق پراپرتی یا متد مربوطه، به رکورد آن دسترسی دارید و می توانید تغییرات مورد نظر را نسبت به رکورد والد انجام دهید.
به عنوان مثال نغییر پروفایل مربوط به کاربر مالک پروفایل.

🔖 #Laravel, #PHP, #لاراول, #فصل_۴

👤 AmirHossein

💎 Channel: @DevelopixLaravel
2👍1
فصل چهار - مدل‌ها و Eloquent ORM

بخش سوم - روابط - قسمت دوم

رابطه One-to-Many (یک به چند)


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

مثال:
- یک کاربر می‌تواند چندین پست داشته باشد.
- یک پست می‌تواند چندین نظر داشته باشد.

1- ساختار جداول:
برای پیاده‌سازی رابطه یک به چند، ما نیاز به دو جدول داریم: یکی به عنوان مدل والد و دیگری به عنوان مدل فرزند. جدول فرزند یک کلید خارجی (foreign key) دارد که به مدل والد مرتبط است.

مثال:
جدول users اطلاعات کاربران را نگهداری می‌کند و یک فیلد id به عنوان primary key دارد.
جدول posts اطلاعات پست‌های کاربران را نگهداری می‌کند و دارای یک ستون به نام user_id است که به کلید خارجی در جدول users اشاره می‌کند.

2- ایجاد مدل‌ها:

1-مدل User، نشان‌دهنده جدول users است. این مدل می‌تواند چندین پست داشته باشد، بنابراین رابطه یک به چند از طریق متد hasMany تعریف می‌شود. این متد مشابه hasOne است اما چندین رکورد را تحت تاثیر قرار می دهد.
public function posts()
{
return $this->hasMany(Post::class);
}


2- مدل Post نشان‌دهنده جدول posts است. هر پست به یک کاربر تعلق دارد، بنابراین رابطه یک به چند از سمت پست با متد belongsTo تعریف می‌شود.
public function user()
{
return $this->belongsTo(User::class);
}


3- پیاده‌سازی رابطه:
برای دسترسی به تمامی پست‌های یک کاربر، می‌توانید از پراپرتی posts استفاده کنید که رابطه hasMany را تعریف کرده است.
$user = User::find(1);
$posts = $user->posts;


برای دسترسی به کاربر مربوط به یک پست، می‌توانید از پراپرتی user استفاده کنید که رابطه belongsTo را تعریف کرده است.
$post = Post::find(1);
$user = $post->user;


برای ایجاد یک پست جدید برای یک کاربر، می‌توانید از متد posts() استفاده کنید و پست را به آن کاربر مرتبط کنید.
$user = User::find(1);

$post = new Post([
'title' => 'My Third Post'
]);

$user->posts()->save($post);


و حتی می‌توانید پست‌های یک کاربر را به‌سادگی به‌روزرسانی کنید.
$user = User::find(1);
$post = $user->posts()->first();
$post->title = 'Updated Title';
$post->save();


با استفاده از روابط در لاراول بدون استفاده از عملیات های پیچیده رکورد های مرتبط به هم بازیابی/حذف/ویرایش یا ایجاد می شوند.

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

🔖 #Laravel, #PHP, #لاراول, #فصل_۴

👤 AmirHossein

💎 Channel: @DevelopixLaravel
2👍2
فصل چهار - مدل‌ها و Eloquent ORM

بخش سوم - روابط - قسمت سوم

رابطه Many-to-Many (چند به چند)

رابطه چند به چند (Many-to-Many) یکی از روابط رایج در سیستم‌های دیتابیس است که در آن چند رکورد از یک جدول می‌تواند با چندین رکورد از جدول دیگر مرتبط باشد، و برعکس. برای پیاده‌سازی این نوع رابطه، از یک جدول واسط (pivot table) استفاده می‌شود که شناسه‌های هر دو جدول را نگه می‌دارد و این ارتباط را برقرار می‌کند.

مثال:

- یک کاربر می‌تواند چندین نقش داشته باشد و یک نقش می‌تواند به چندین کاربر اختصاص داده شود.
- یک دانشجو می‌تواند در چندین کلاس شرکت کند و یک کلاس می‌تواند چندین دانشجو داشته باشد.
- یک محصول می‌تواند در چندین دسته‌بندی قرار بگیرد و هر دسته‌بندی می‌تواند شامل چندین محصول باشد.

1- ساختار جداول:

برای پیاده‌سازی رابطه چند به چند، شما به سه جدول نیاز دارید:

مثال:

1- جدول اصلی (users): اطلاعات کاربران را نگه می‌دارد.
2- جدول ثانویه (roles): اطلاعات نقش‌ها را نگه می‌دارد.
3- جدول واسط (pivot table - role_user): جدول واسط، شناسه‌های کاربران و نقش‌ها را نگه می‌دارد و رابطه چند به چند را برقرار می‌کند.

جداول اصلی و ثانویه، هر کدام دارای یک فیلد id به عنوان primary key هستند.

جدول واسط دارای دو فیلد foreign key برای جداول اصلی و ثانویه هستند. این فیلد ها به صورت پیشفرض باید با نام های جداول اصلی با پسوند _id باشند.
در مثال ما role_id و user_id هستند.
همچنین نام جدول واسط باید ترکیب مفرد جداول اصلی و واسط باشد. در مثال ما role_user می باشد.

2- ایجاد مدل‌ها:

مدل User نشان‌دهنده جدول users است و رابطه چند به چند با مدل Role دارد. این رابطه با استفاده از متد belongsToMany تعریف می‌شود.
public function roles()
{
return $this->belongsToMany(Role::class);
}


مدل Role نشان‌دهنده جدول roles است و رابطه چند به چند با مدل User دارد. این رابطه نیز با استفاده از متد belongsToMany تعریف می‌شود.
public function users()
{
return $this->belongsToMany(User::class);
}


متد belongsToMany :
برای تعریف رابطه چند به چند استفاده می‌شود و می‌تواند چندین پارامتر اختیاری دریافت کند.

1. مدل مربوطه - الزامی
نام مدل مرتبط با این رابطه.

2. جدول واسط - اختیاری
نام جدول واسط (pivot table). اگر این پارامتر تعیین نشود، لاراول به‌طور خودکار نام جداول مرتبط را به ترتیب حروف الفبا ترکیب می‌کند (مثلاً role_user).

3. کلید خارجی مدل فعلی - اختیاری
نام ستون کلید خارجی در جدول واسط که به مدل فعلی اشاره دارد. اگر تعیین نشود، به‌طور پیش‌فرض نام مدل به همراه _id استفاده می‌شود.

4. کلید خارجی مدل مربوطه - اختیاری
نام ستون کلید خارجی در جدول واسط که به مدل مرتبط اشاره دارد. اگر تعیین نشود، به‌طور پیش‌فرض نام مدل مربوطه به همراه _id استفاده می‌شود.

5. کلید والد در مدل فعلی - اختیاری
ستون کلید منحصر به فرد در مدل فعلی. به‌طور پیش‌فرض، لاراول از ستون id استفاده می‌کند.

6. کلید والد در مدل مرتبط - اختیاری
ستون کلید منحصر به فرد در مدل مربوطه. به‌طور پیش‌فرض، لاراول از ستون id استفاده می‌کند.

3- استفاده از رابطه:

برای بازیابی تمامی نقش‌های یک کاربر، از پراپرتی roles که با استفاده از belongsToMany تعریف شده، استفاده می‌کنیم.
$user = User::find(1);
$roles = $user->roles;


برای بازیابی تمامی کاربران مرتبط با یک نقش، از پراپرتی users که در مدل Role تعریف شده، استفاده می‌کنیم.
$role = Role::find(1);
$users = $role->users;


در قسمت بعد متد های مربوط به اعمال تغییرات روی روابط چند به چند توضیح داده می شود.

🔖 #Laravel, #PHP, #لاراول, #فصل_۴

👤 AmirHossein

💎 Channel: @DevelopixLaravel
4👍3
فصل چهار - مدل‌ها و Eloquent ORM

بخش سوم - روابط - قسمت چهارم

1- متد attach
برای افزودن رکوردهای جدید به جدول واسط (pivot table) استفاده می‌شود. با این متد می‌توانید رابطه‌های جدیدی را بین مدل اصلی و مدل مرتبط ایجاد کنید.
$user = User::find(1);
$user->roles()->attach([1, 2]);

نقش‌های 1 و 2 به کاربر شماره 1 اختصاص داده می‌شوند و این رابطه‌ها در جدول واسط (role_user) اضافه می‌شوند.

همچنین می‌توانید داده‌های اضافی به جدول واسط نیز اضافه کنید:
$user->roles()->attach(1, ['assigned_at' => now()]);


2- متد detach
برای حذف رابطه‌های موجود در جدول واسط استفاده می‌شود. این متد می‌تواند رابطه‌های مرتبط با مدل فعلی را از مدل‌های دیگر حذف کند.
$user = User::find(1);
$user->roles()->detach(2);

نقش شماره 2 از کاربر شماره 1 حذف می‌شود.

3- متد sync
برای همگام‌سازی روابط استفاده می‌شود. این متد رابطه‌های فعلی را با رابطه‌های جدید جایگزین می‌کند:

- اگر شناسه‌ای در لیست وجود داشته باشد که قبلاً با مدل مرتبط نبوده، آن شناسه اضافه می‌شود.

- اگر شناسه‌ای در لیست نباشد، و قبلاً مرتبط بوده، آن شناسه حذف می‌شود.

- شناسه‌هایی که هم اکنون با مدل مرتبط هستند و در لیست جدید نیز وجود دارند، دست نخورده باقی می‌مانند.
$user = User::find(1);
$user->roles()->sync([1, 3]);

بسته به شرایط توضیح داده شده روابط از جدول واسط، حذف/اضافه یا ویرایش می شوند.

این متد آرایه‌ای از رکوردهای attached, detached, و updated را برمی‌گرداند، که گزارشی از تغییرات روی روابط است.

4- متد syncWithPivotValues
مشابه sync عمل می‌کند، اما به شما امکان می‌دهد داده‌های اضافی را در جدول واسط تنظیم کنید. هر بار که رابطه همگام‌سازی می‌شود، می‌توانید مقادیر داده‌های اضافی را نیز ارائه دهید.
$user = User::find(1);
$user->roles()->syncWithPivotValues([1, 2], ['assigned_at' => now()]);

نقش‌های 1 و 2 همگام‌سازی می‌شوند و ستون assigned_at برای هر رابطه به زمان فعلی تنظیم می‌شود.

5- متد syncWithoutDetaching
همانند sync عمل می‌کند، با این تفاوت که رابطه‌های فعلی را حذف نمی‌کند و فقط رکوردهای جدید را اضافه می‌کند.

6- متد toggle
نقش‌ها را اضافه می‌کند اگر وجود نداشته باشند و حذف می‌کند اگر وجود داشته باشند. به عبارتی دیگر، نقش‌ها را روشن و خاموش می‌کند.
$user = User::find(1);
$user->roles()->toggle([1, 2]);


7- متد updateExistingPivot
برای به‌روزرسانی داده‌های جدول واسط برای یک رابطه موجود استفاده می‌شود. این متد رکوردهای مرتبط را در جدول واسط به‌روزرسانی می‌کند.
$user = User::find(1);
$user->roles()->updateExistingPivot(1, ['assigned_at' => now()]);

مقدار assigned_at برای نقش شماره 1 به روز شده است.

8- متد push
تمام تغییرات انجام‌شده روی مدل فعلی و مدل‌های مرتبط آن را به پایگاه داده ذخیره می‌کند. این متد به شما امکان می‌دهد چندین تغییر را به طور همزمان ذخیره کنید.
$user = User::find(1);
$user->name = "John Updated";
$user->roles[0]->name = "Admin Updated";
$user->push();

هم تغییرات اعمال‌شده روی مدل اصلی (user) و هم تغییرات مربوط به مدل‌های مرتبط (roles) ذخیره می‌شوند.

9- متد pushQuietly
مشابه push است، اما بدون اجرای رویدادهای مربوطه، مدل را ذخیره می‌کند.

نکته: دو متد بعدی مربوط به روابط One-to-Many و Many-to-One می باشند.

10- متد associate
برای برقراری ارتباط بین یک رکورد فرزند و یک رکورد والد استفاده می‌شود. با associate، کلید خارجی در مدل فرزند تنظیم می‌شود تا به رکورد والد مرتبط شود.
$post = Post::find(1); 
$user = User::find(1);

$post->user()->associate($user);
$post->save();

با استفاده از associate، کلید خارجی user_id در جدول posts به شناسه کاربر تنظیم می‌شود.

11- متد dissociate
برای قطع ارتباط بین یک رکورد فرزند و رکورد والد استفاده می‌شود. این متد کلید خارجی در مدل فرزند را حذف (null) می‌کند و رابطه را از بین می‌برد.
$post = Post::find(1); 

$post->user()->dissociate();
$post->save()

با استفاده از dissociate، کلید خارجی user_id در جدول posts به مقدار null تنظیم می‌شود.

از قسمت بعد به سایر روابط می پردازیم.

🔖 #Laravel, #PHP, #لاراول, #فصل_۴

👤 AmirHossein

💎 Channel: @DevelopixLaravel
4👍3
⚜️ دوره لاراول - قسمت چهاردهم
📚 دیتابیس - Relations - روابط

خلاصه :
توی این ویدیو به بحث Relations یا همون روابط پرداختیم
در ویدیو های بعدی به ساخت یه مینی پروژه خفن میپردازیم.

🎞 لینک ویدیو:
https://youtu.be/YsHgeg9hKMw

🔖 #Laravel, #PHP, #لاراول

👤 Matin Soleymani

💎 Channel: @DevelopixLaravel
6
فصل چهار - مدل‌ها و Eloquent ORM

بخش سوم - روابط - قسمت پنجم

رابطه Has-Many-Through و Has-One-Through


رابطه Has-Many-Through زمانی استفاده می‌شود که یک مدل بتواند از طریق یک مدل واسط (Intermediate Model) به چندین رکورد در یک مدل دیگر دسترسی پیدا کند. به عبارت دیگر، این رابطه به شما اجازه می‌دهد که یک مدل با یک مدل دورتر (که مستقیماً به آن مرتبط نیست) ارتباط داشته باشد و بتوانید از طریق یک مدل واسط، رکوردهای آن را بازیابی کنید.

مثال:
فرض کنید شما سه جدول دارید:
1- جدول کشورها.
2- جدول کاربران که هر کاربر متعلق به یک کشور است.
3- جدول پست‌ها که هر پست توسط یک کاربر نوشته شده است.

اگر بخواهید همه پست‌هایی که در یک کشور خاص نوشته شده‌اند را پیدا کنید، این کار را از طریق رابطه Has-Many-Through انجام می‌دهید.

1- ساختار جداول:
جدول countries اطلاعات کشورها را نگهداری می‌کند. این جدول دارای یک فیلد id به عنوان primary key است.

جدول users اطلاعات کاربران را نگهداری می‌کند. این جدول دارای یک فیلد id به عنوان primary key و یک کلید خارجی (country_id) است که به جدول countries اشاره دارد.

جدول posts اطلاعات پست‌های نوشته شده توسط کاربران را نگهداری می‌کند. این جدول دارای یک فیلد id به عنوان primary key و یک کلید خارجی (user_id) است که به جدول users اشاره دارد.

2- تعریف رابطه:
ابتدا با دو متد جدید برای ایجاد روابط آشنا می شویم:

1- متد hasOneThrough
زمانی استفاده می‌شود که یک رکورد از یک مدل از طریق یک مدل واسط، تنها به یک رکورد از مدل دیگری مرتبط باشد.
public function relatedModel()
{
return $this->hasOneThrough(FinalModel::class, IntermediateModel::class);
}

پارامترها:
1- نام مدل نهایی که قصد دارید به آن دسترسی داشته باشید.
2- نام مدل واسط که بین مدل اصلی و مدل نهایی قرار دارد.
3- نام ستون کلید خارجی در مدل واسط که به مدل اصلی (جایی که رابطه را تعریف می‌کنید) اشاره می‌کند.(اختیاری)
4- نام ستون کلید خارجی در مدل نهایی که به مدل واسط اشاره می‌کند.(اختیاری)
5- نام ستون کلید محلی در مدل اصلی. به‌طور پیش‌فرض از id استفاده می‌شود.(اختیاری)
6- نام ستون کلید محلی در مدل واسط. به‌طور پیش‌فرض از id استفاده می‌شود.(اختیاری)

2- متد hasManyThrough
برای دسترسی به چندین رکورد از یک مدل از طریق یک مدل واسط استفاده می‌شود. این متد معمولاً در مواقعی استفاده می‌شود که یک مدل بتواند از طریق یک مدل واسط به چندین رکورد در یک مدل دیگر دسترسی داشته باشد.
سینتکس و پارامتر ها مشابه hasOneThrough می باشد.
———

در این مثال، کشورها (Country) از طریق کاربران (User) به پست‌ها (Post) مرتبط هستند. بنابراین، یک کشور می‌تواند از طریق کاربران خود به چندین پست دسترسی داشته باشد.

مدل Country:
این مدل از طریق کاربران به پست‌ها دسترسی پیدا می‌کند. رابطه Has-Many-Through در این مدل تعریف می‌شود.

public function posts()
{
return $this->hasManyThrough(Post::class, User::class, 'country_id', 'user_id');
}


مدل User:
رابطه‌ای مستقیم بین کاربران و پست‌ها وجود دارد. این مدل برای ارتباط میان کشورها و پست‌ها استفاده می‌شود.
public function country()
{
return $this->belongsTo(Country::class);
}

public function posts()
{
return $this->hasMany(Post::class);
}


مدل Post:
هر پست متعلق به یک کاربر است.
public function user()
{
return $this->belongsTo(User::class);
}


3- استفاده از رابطه:
حال اگر بخواهید تمام پست‌های نوشته‌شده در یک کشور خاص (مثلاً "USA") را پیدا کنید:
$country = Country::find(1); // USA
$posts = $country->posts;

در این مثال، کشور "USA" از طریق کاربران خود به تمام پست‌هایی که کاربرانش نوشته‌اند، دسترسی پیدا می‌کند.
———

روابط Has-Many-Through و Has-One-Through در ساختار جداول و مدل ها کاملا یکسان هستند، جز تفاوت در استفاده از متد های hasManyThrough یا hasOneThrough بسته به نوع رابطه.

تفاوت در عمل نیز به این صورت است که Has-One-Through برای زمانی استفاده می‌شود که می‌خواهیم از طریق یک مدل واسط به یک رکورد از مدل نهایی دسترسی پیدا کنیم، در صورتی که Has-Many-Through برای زمانی است که می‌خواهیم از طریق یک مدل واسط به چندین رکورد از مدل نهایی دسترسی داشته باشیم.

به طور کلی انتظار داریم از Has-One-Through فقط یک رکورد دریافت کنیم، در حالی که از Has-Many-Through ممکن است چندین رکورد دریافت کنیم.

🔖 #Laravel, #PHP, #لاراول, #فصل_۴

👤 AmirHossein

💎 Channel: @DevelopixLaravel
5👍5
فصل چهار - مدل‌ها و Eloquent ORM

بخش سوم - روابط - قسمت ششم

رابطه Polymorphic Relationships


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

این نوع روابط به دو دسته اصلی تقسیم می‌شوند:

1- One-to-One/One-to-Many
2- Many-to-Many

نوع One-to-One/One-to-Many:
در این نوع رابطه، یک مدل می‌تواند به چندین مدل مختلف به صورت یک به یک یا یک به چند مرتبط شود. برای این کار از دو ستون morphable_id و morphable_type در جدول استفاده می‌شود که به ترتیب شناسه مدل و نوع مدل مرتبط را مشخص می‌کنند.

فرض کنید شما می‌خواهید یک سیستم نظر‌دهی ایجاد کنید که کاربران بتوانند به پست‌ها و ویدئوها نظر دهند. به جای ایجاد دو جدول جداگانه برای نظرهای پست‌ها و نظرهای ویدئوها، می‌توانید از یک جدول مشترک comments استفاده کنید و از رابطه Polymorphic بهره ببرید.

1- ساختار جداول:
جدول comments در کنار سایر فیلد ها، دو فیلد commentable_id و commentable_type را دارد.

نکته: شیوه نام گذاری، اسم مفرد جدول با پسوند های able_id و able_type می باشد، مانند commentable_id و commentable_type.

تعریف مدل ها:
ابتدا با متد های مربوطه آشنا می شویم:

1- متد morphTo
این متد برای ارتباط با یک مدل چندشکلی استفاده می‌شود.

پارامتر ها:
1- نام رابطه. اگر این پارامتر مشخص نشود، لاراول به‌صورت خودکار نام رابطه را با توجه به فیلدهای *_id و *_type تشخیص می‌دهد.
2- نام ستون *_type که نوع مدل را نگه می‌دارد. به طور پیش‌فرض لاراول ستون *_type را با توجه به نام رابطه ایجاد می‌کند.
3- نام ستون *_id که شناسه مدل را نگه می‌دارد. به طور پیش‌فرض لاراول ستون *_id را با توجه به نام رابطه ایجاد می‌کند.

2- متد morphOne
این متد برای تعریف رابطه یک به یک چندشکلی استفاده می‌شود. در این رابطه، یک مدل می‌تواند به یک رکورد از مدل‌های مختلف مرتبط باشد.

پارامتر ها:
1- نام کلاس مدلی که رابطه با آن برقرار است.
2- نام رابطه چندشکلی که برای فیلدهای *_id و *_type در مدل فرزند استفاده می‌شود.

3- متد morphMany
این متد مشابه morphOne اما برای تعریف رابطه یک به چند چندشکلی استفاده می‌شود. یعنی یک مدل می‌تواند با چندین رکورد از مدل‌های مختلف مرتبط باشد.

4- متد morphToMany
این متد مشابه morphOne اما برای تعریف رابطه چند به چند چندشکلی استفاده می‌شود. یعنی یک مدل می‌تواند با چندین رکورد از مدل‌های مختلف از طریق یک جدول واسط مرتبط باشد.

5- متد morphedByMany
این متد مشابه morphOne اما برای تعریف رابطه چند به چند چندشکلی از سمت مدل معکوس استفاده می‌شود. یعنی مدلی که در رابطه‌ی چند به چند چندشکلی، سمت دیگر رابطه است.
———
مدل Comment:
در این مدل، از متد morphTo برای ارتباط با مدل‌های دینامیک (پست‌ها و ویدئوها) استفاده می‌شود.
public function commentable()
{
return $this->morphTo();
}


مدل Post و Video
از متد morphMany استفاده می‌شود تا مشخص شود که هر پست می‌تواند چندین نظر داشته باشد. (این متد در هر دو مدل تعریف می شود. بسته به نوع رابطه از متد morphOne نیز استفاده می شود.)
public function comments()
{
return $this->morphMany(Comment::class, 'commentable');
}


شیوه استفاده مانند روابط قبلی می باشد.
———
نوع Many-to-Many:

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

فرض کنید یک سیستم tags دارید که برچسب‌ها می‌توانند به پست‌ها، ویدئوها و حتی به سایر مدل‌ها مرتبط باشند.

ساختار جداول:
جدول اصلی با نام tags یک فیلد id به صورت primary key دارد.
جدول واسط با نام taggables دو فیلد taggable_id و taggable_type طبق قوانین نام گذاری و یک فیلد tag_id به صورت کلید خارجی برای جدول tags می باشد.

تعریف مدل‌ها:


مدل Tag:
در این مدل، از متد morphedByMany برای تعریف ارتباط برچسب با مدل‌های مختلف (پست‌ها، ویدئوها) استفاده می‌شود.
public function posts()
{
return $this->morphedByMany(Post::class, 'taggable');
}

public function videos()
{
return $this->morphedByMany(Video::class, 'taggable');
}


مدل Post و Video:

از متد morphToMany برای ارتباط با برچسب‌ها استفاده می‌شود.
public function tags()
{
return $this->morphToMany(Tag::class, 'taggable');
}


شیوه استفاده نیز مانند روابط Many To Many است.

🔖 #Laravel, #PHP, #لاراول, #فصل_۴

👤 AmirHossein

💎 Channel: @DevelopixLaravel
8👍3
فصل چهار - مدل‌ها و Eloquent ORM

بخش سوم - روابط - قسمت هفتم

متد های روابط

1- متد with
برای Eager Loading روابط استفاده می‌شود. با استفاده از این متد، می‌توانید قبل از اجرای کوئری و دریافت نتایج، تمام روابط مرتبط با مدل را نیز به‌طور پیش‌فرض بارگذاری کنید.
$posts = Post::with('comments')->get();

این کد همه پست‌ها را به همراه نظرات (comments) مرتبط با آن‌ها در یک کوئری بارگذاری می‌کند. (comments نام رابطه تعریف شده می باشد)

2- متد withCount
تعداد رکوردهای مرتبط با هر رکورد از مدل اصلی را بدون بارگذاری کامل رابطه محاسبه می‌کند. این متد تعداد رکوردهای مرتبط را به عنوان یک ستون اضافی برمی‌گرداند.

3- متد withMax
مقدار بیشینه یک فیلد از رکوردهای مرتبط را محاسبه می‌کند.

4- متد withAvg
مقدار میانگین یک فیلد از رکوردهای مرتبط را محاسبه می‌کند.

5- متد withSum
مقدار جمع یک فیلد از رکوردهای مرتبط را محاسبه می‌کند.

6- متد withExists
بررسی می‌کند که آیا یک رابطه مرتبط وجود دارد یا خیر، و این نتیجه را به عنوان یک ستون exists برمی‌گرداند.

7- متد without
برای غیرفعال کردن بارگذاری یک رابطه خاص که قبلاً در یک اسکوپ یا کوئری دیگر بارگذاری شده است استفاده می‌شود.
$posts = Post::without('comments')->get();


8- متد withOnly
فقط روابط خاصی که مشخص شده‌اند را بارگذاری می‌کند، حتی اگر اسکوپ‌های دیگر در حال بارگذاری روابط دیگر باشند.
$posts = Post::withOnly('comments')->get();


9- متد withWhereHas
برای بارگذاری روابط همراه با یک شرط خاص روی رکوردهای آن رابطه استفاده می‌شود.
$posts = Post::withWhereHas('comments', function ($query) {
$query->where('likes', '>', 10);
})->get();

این کد پست‌هایی را بارگذاری می‌کند که نظرات آن‌ها بیش از 10 لایک دارند.

10- متد morphWithCount
برای بارگذاری رابطه‌های چندشکلی به همراه شمارش رکوردهای مرتبط استفاده می‌شود.
$users = User::morphWithCount([Post::class => ['comments']])->get();

این کد رابطه‌های چندشکلی را با شمارش تعداد نظرات در پست‌ها برای هر کاربر بارگذاری می‌کند.

11- متد load
برای Lazy Loading استفاده می‌شود. این متد پس از اجرای کوئری اصلی، روابط مرتبط را بارگذاری می‌کند.
$post = Post::find(1);
$post->load('comments');


12- متد loadMissing
روابطی که قبلاً بارگذاری نشده‌اند را بارگذاری می‌کند. اگر یک رابطه قبلاً بارگذاری شده باشد، این متد دوباره آن را بارگذاری نمی‌کند.

13- متد loadCount
برای بارگذاری تعداد رکوردهای مرتبط با مدل اصلی استفاده می‌شود، بدون اینکه رابطه به‌طور کامل بارگذاری شود.

14- متد loadMorph
برای بارگذاری روابط چندشکلی (Polymorphic) استفاده می‌شود و به شما اجازه می‌دهد که رابطه‌های چندشکلی خاصی را بارگذاری کنید.
$comment = Comment::find(1);
$comment->loadMorph('commentable', [Post::class => ['comments'], Video::class => ['likes']]);

این کد بارگذاری چندشکلی را برای رابطه commentable انجام می‌دهد و روابط comments برای پست‌ها و likes برای ویدئوها بارگذاری می‌شود.

15- متد loadMorphCount
تعداد رکوردهای مرتبط در رابطه‌های چندشکلی را بدون بارگذاری کامل آن‌ها محاسبه می‌کند.
$comment = Comment::find(1);
$comment->loadMorphCount('commentable', [Post::class => ['comments'], Video::class => ['likes']]);

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

16- متد loadSum
برای محاسبه جمع یک ستون خاص در رابطه‌های مرتبط استفاده می‌شود.
$post = Post::find(1);
$post->loadSum('comments', 'likes');


17- متد has
برای اعمال شرط بر اساس وجود یا عدم وجود رکوردهای مرتبط استفاده می‌شود. در واقع، این متد پست‌هایی را برمی‌گرداند که رابطه‌ی مشخصی دارند.
$posts = Post::has('comments')->get();


18- متد orHas
به عنوان جایگزین OR در کوئری برای چک کردن وجود رکوردهای مرتبط استفاده می‌شود.
$posts = Post::has('comments')->orHas('likes')->get();


19- متد resolveRelationUsing
برای بازنویسی نحوه‌ی استفاده از یک رابطه به صورت دلخواه در لاراول استفاده می‌شود. با استفاده از این متد، شما می‌توانید تعریف سفارشی از یک رابطه را در مدل خود پیاده‌سازی کنید.
User::resolveRelationUsing('profile', function ($model) {
return $model->hasOne(Profile::class);
});

این کد نحوه بارگذاری رابطه profile را برای مدل User بازنویسی می‌کند.

🔖 #Laravel, #PHP, #لاراول, #فصل_۴

👤 AmirHossein

💎 Channel: @DevelopixLaravel
9👍3
فصل چهار - مدل‌ها و Eloquent ORM

بخش چهارم - اسکوپ ها

اسکوپ‌ها (Scopes) در لاراول به شما اجازه می‌دهند که منطق جستجو یا کوئری‌های پیچیده‌ای را به صورت توابع قابل استفاده مجدد تعریف کنید. این اسکوپ‌ها به شما کمک می‌کنند که کوئری‌های مشابه را در سراسر برنامه به راحتی مدیریت کنید. اسکوپ‌ها به دو دسته اصلی تقسیم می‌شوند:

1- Local Scopes (اسکوپ‌های محلی)
2- Global Scopes (اسکوپ‌های سراسری)

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

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

فرض کنید یک جدول کاربران داریم که دارای یک ستون active است. می‌خواهیم کاربران فعال را با استفاده از یک اسکوپ بازیابی کنیم.
class User extends Model
{
public function scopeActive($query)
{
return $query->where('active', 1);
}
}

// Usage:
$activeUsers = User::active()->get();

اسکوپ active فقط کاربران فعال (active = 1) را بازیابی می‌کند. همانطور که در مثال مشخص است متد اسکوپ با "scope" شروع می شود اما در هنگام استفاده از متد حذف می شود.

پذیرفتن پارامترها در اسکوپ‌های محلی:
اسکوپ‌های محلی می‌توانند پارامترهای ورودی داشته باشند تا بتوانند بر اساس نیازهای مختلف تنظیم شوند.
class User extends Model
{
public function scopeOlderThan($query, $age)
{
return $query->where('age', '>', $age);
}
}

// Usage:
$users = User::olderThan(25)->get();

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

برای تعریف یک اسکوپ سراسری، شما باید یک کلاس جدید که از Scope پیروی می‌کند ایجاد کنید. این کلاس شامل متد apply است که منطق اسکوپ در آن تعریف می‌شود. می توانید از کامند زیر استفاده کنید:
php artisan make:scope ActiveScope


فرض کنید شما می‌خواهید فقط کاربران فعال را به صورت پیش‌فرض نمایش دهید.
ابتدا یک کلاس اسکوپ سراسری ایجاد می‌کنیم:
class ActiveScope implements Scope
{
public function apply(Builder $builder, Model $model)
{
$builder->where('active', 1);
}
}


سپس باید این اسکوپ سراسری را به مدل مورد نظر اضافه کنیم.
class User extends Model
{
protected static function booted()
{
static::addGlobalScope(new ActiveScope);
}
}


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

در برخی موارد ممکن است بخواهید اسکوپ سراسری را برای یک کوئری خاص غیرفعال کنید. برای این کار از متد withoutGlobalScope یا withoutGlobalScopes استفاده می‌کنید.
// Without ActiveScope
$users = User::withoutGlobalScope(ActiveScope::class)->get();

// Without any global scope
$users = User::withoutGlobalScopes()->get();


شما می‌توانید به صورت پویا اسکوپ‌های سراسری خود را با پارامترهای ورودی تنظیم کنید. برای این کار کافی است اسکوپ سراسری خود را با یک پارامتر سفارشی تعریف کنید.
class AgeScope implements Scope
{
protected $age;

public function __construct($age)
{
$this->age = $age;
}

public function apply(Builder $builder, Model $model)
{
$builder->where('age', '>', $this->age);
}
}

// Usage:
class User extends Model
{
protected static function booted()
{
static::addGlobalScope(new AgeScope(30));
}
}


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

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

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

🔖 #Laravel, #PHP, #لاراول, #فصل_۴

👤 AmirHossein

💎 Channel: @DevelopixLaravel
4👍2
فصل چهار - مدل‌ها و Eloquent ORM

بخش پنجم - پراپرتی های مدل

1- پراپرتی table
نام جدول دیتابیس مرتبط با مدل را مشخص می‌کند. به‌صورت پیش‌فرض، لاراول نام مدل را با حروف کوچک و به صورت جمع تبدیل می‌کند.
protected $table = 'my_custom_table';


2- پراپرتی primaryKey
برای مشخص کردن نام ستون کلید اصلی جدول استفاده می‌شود. به‌صورت پیش‌فرض، از ستون id به عنوان کلید اصلی استفاده می‌کند.
protected $primaryKey = 'user_id';


3- پراپرتی keyType
نوع داده کلید اصلی را مشخص می‌کند. به‌صورت پیش‌فرض، لاراول از نوع int برای کلید اصلی استفاده می‌کند.
protected $keyType = 'string';


4- پراپرتی incrementing
مشخص می‌کند که آیا کلید اصلی به صورت خودکار افزایش می‌یابد یا خیر. به‌صورت پیش‌فرض، این ویژگی true است و کلید اصلی افزایش می‌یابد.
public $incrementing = false;


5- پراپرتی timestamps
مشخص می‌کند که آیا ستون‌های created_at و updated_at به‌صورت خودکار مدیریت شوند یا خیر. به‌صورت پیش‌فرض، این ویژگی true است.
public $timestamps = false;


6- پراپرتی dateFormat
فرمت ذخیره‌سازی تاریخ‌ها در دیتابیس را مشخص می‌کند. به‌صورت پیش‌فرض، از فرمت Y-m-d H:i:s استفاده می‌کند.
protected $dateFormat = 'U';


7- پراپرتی connection
مشخص می‌کند که مدل باید از کدام اتصال دیتابیس استفاده کند. به‌صورت پیش‌فرض، مدل‌ها از اتصال اصلی که در فایل config/database.php تعریف شده است استفاده می‌کنند.
protected $connection = 'mysql2';


8- پراپرتی fillable
لیستی از ستون‌هایی را مشخص می‌کند که در هنگام انتساب جمعی (Mass Assignment) اجازه مقداردهی دارند. این ویژگی برای جلوگیری از حملات Mass Assignment بسیار مهم است.

protected $fillable = ['name', 'email', 'password'];


9- پراپرتی guarded
برعکس fillable عمل می‌کند و ستون‌هایی که نباید به‌صورت جمعی مقداردهی شوند را مشخص می‌کند. اگر guarded را خالی بگذارید، به معنای آن است که همه ستون‌ها محافظت شده‌اند.
protected $guarded = ['is_admin'];


10- پراپرتی hidden
مشخص می‌کند که کدام ستون‌ها در هنگام تبدیل مدل به آرایه یا JSON باید مخفی شوند و نمایش داده نشوند.
protected $hidden = ['password', 'remember_token'];


11- پراپرتی visible
برعکس hidden عمل می‌کند و مشخص می‌کند که فقط ستون‌های مشخص‌شده در خروجی JSON یا آرایه نمایش داده شوند. سایر ستون‌ها مخفی خواهند بود.
protected $visible = ['name', 'email'];


12- پراپرتی dates
مشخص می‌کند که کدام ستون‌ها به عنوان تاریخ در نظر گرفته شوند و به‌طور خودکار به Carbon تبدیل شوند. به‌صورت پیش‌فرض، ستون‌های created_at و updated_at به عنوان تاریخ مدیریت می‌شوند.
protected $dates = ['birthday'];


13- پراپرتی touches
برای به‌روزرسانی زمان مدل‌های مرتبط استفاده می‌شود. اگر یک مدل دارای رابطه‌ای باشد که باید هنگام تغییر مدل فرزند، زمان به‌روزرسانی (updated_at) مدل والد نیز تغییر کند، می‌توانید از این ویژگی استفاده کنید.
protected $touches = ['post'];


14- پراپرتی perPage
تعداد رکوردهایی که در هر صفحه برای صفحه‌بندی (pagination) نمایش داده می‌شوند را تنظیم می‌کند. به‌صورت پیش‌فرض، مقدار perPage برابر 15 است.
protected $perPage = 20;


15- پراپرتی morphClass
برای روابط Polymorphic استفاده می‌شود و مشخص می‌کند که لاراول چه مقداری را در ستون *_type قرار دهد. به‌صورت پیش‌فرض، نام کامل کلاس مدل در ستون *_type ذخیره می‌شود.
protected $morphClass = 'post';


16- پراپرتی relationResolvers
برای بازنویسی روابط در مدل‌ها استفاده می‌شود. اگر بخواهید نحوه فراخوانی یک رابطه را تغییر دهید یا به‌صورت دلخواه تعریف کنید، می‌توانید از relationResolvers استفاده کنید.
protected $relationResolvers = [
'profile' => 'resolveProfile',
];

public function resolveProfile()
{
return $this->hasOne(Profile::class);
}


17- پراپرتی foreignKeyType
برای تعریف نوع داده کلیدهای خارجی استفاده می‌شود.
protected $foreignKeyType = 'string';


تعدادی از پراپرتی در پست های بعدی توضیح داده می شود.
توجه داشته باشید که مدل ها، پراپرتی ها و متد های قابل Override زیادی دارند که در این دوره نام برده نمی شوند.

🔖 #Laravel, #PHP, #لاراول, #فصل_۴

👤 AmirHossein

💎 Channel: @DevelopixLaravel
👍4
فصل چهار - مدل‌ها و Eloquent ORM

بخش ششم - Casts


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

برای تعریف Castهای پیش‌فرض، متد casts() را در مدل خود پیاده‌سازی می‌کنید.
protected function casts(): array
{
return [
'is_active' => 'boolean',
'birthday' => 'date',
];
}

این کست ها باعث می شود داده به طور خودکار به فرمت یا نوع مشخص شده تبدیل شوند، به عنوان مثال اگر فیلد is_active برابر 0 باشد به واسطه کست ها به false تبدیل می شود.

در لاراول، چندین نوع Cast پیش‌فرض وجود دارد که به شما امکان می‌دهد داده‌ها را به صورت خودکار به نوع‌های مختلف تبدیل کنید. در زیر لیست این Castها آورده شده است:
'is_active' => 'boolean',
'age' => 'integer',
'price' => 'float',
'phone_number' => 'string',
'meta' => 'array',
'preferences' => 'json',
'settings' => 'object',
'tags' => 'collection',
'birthday' => 'date',
'created_at' => 'datetime',
'event_time' => 'timestamp',
'birthday' => 'immutable_date',
'created_at' => 'immutable_datetime',
'password' => 'encrypted',


علاوه بر Castهای پیش‌فرض، لاراول این امکان را به شما می‌دهد تا Casts سفارشی بسازید. این Castها به شما اجازه می‌دهند که تبدیل‌های پیچیده‌تری برای داده‌ها اعمال کنید.

برای ساخت یک Cast سفارشی، ابتدا باید یک کلاس ایجاد کنید که قرارداد (interface) CastsAttributes را پیاده‌سازی کند. این کلاس باید دو متد get() و set() را پیاده‌سازی کند.
برای این کار می توانید از دستور زیر استفاده کنید:
php artisan make:cast Uppercase


این کامند یک کلاس برای کست سفارشی شما ایجاد می کنید و شما می توانید متد ها آن را پیاده سازی کنید:
class Uppercase implements CastsAttributes
{
public function get($model, string $key, $value, array $attributes)
{
return strtoupper($value);
}

public function set($model, string $key, $value, array $attributes)
{
return strtolower($value);
}
}


درصورتی که یک فیلد را از دیتابیس فراخوانی کنیم و کست Uppercase ما روی آن اعمال شده باشد متد get اجرا خواهد شد و درصورت دخیره در یک فیلد دیتابیس دارای کست Uppercase متد set اجرا خواهد شد.

توضیح ورودی های متد set و متد get:

1- پارامتر model:
این پارامتر یک شیء مدل را شامل می‌شود که نشان‌دهنده مدل فعلی است که در حال تعامل با آن هستید. این پارامتر به شما اجازه می‌دهد به ویژگی‌های مدل دسترسی داشته باشید.

2- پارامتر key:
این پارامتر نام ویژگی (attribute)‌ای است که Cast برای آن تعریف شده است. با این پارامتر، می‌توانید بدانید که کدام فیلد از مدل در حال پردازش است.

3- پارامتر value:
این پارامتر مقدار فعلی ویژگی (attribute) را شامل می‌شود. هنگام استفاده از get()، مقدار بازیابی‌شده از دیتابیس در این پارامتر قرار دارد و در set()، مقدار جدیدی که کاربر برای آن ویژگی تنظیم کرده است.

4- پارامتر attributes:
این پارامتر آرایه‌ای شامل همه ویژگی‌های مدل و مقادیر آن‌ها است. این پارامتر به شما امکان می‌دهد به سایر ویژگی‌های مدل دسترسی پیدا کنید و بر اساس مقادیر آن‌ها تغییراتی ایجاد کنید.

پس از تعریف Cast سفارشی، شما می‌توانید آن را در متد casts() مدل خود استفاده کنید.
protected function casts(): array
{
return [
'name' => Uppercase::class,
];
}


نکته: در نسخه 10 به قبل کست ها به جای متد در یک پراپرتی ثبت میشوند:
protected $casts = [
'is_admin' => 'boolean',
];


🔖 #Laravel, #PHP, #لاراول, #فصل_۴

👤 AmirHossein

💎 Channel: @DevelopixLaravel
👍73
فصل چهار - مدل‌ها و Eloquent ORM

بخش هفتم -
Accessors و Mutators

به شما این امکان را می‌دهند که نحوه دسترسی به ویژگی‌های مدل یا نحوه تغییر و ذخیره‌سازی داده‌ها در مدل را سفارشی‌سازی کنید. شما می‌توانید Accessors برای نمایش داده‌ها به شکلی متفاوت و Mutators برای ذخیره‌سازی داده‌ها با فرمت موردنظر خود ایجاد کنید.

1- Accessors (دسترسی‌دهنده‌ها)
برای تغییر داده‌هایی استفاده می‌شود که هنگام دسترسی به یک ویژگی مدل نمایش داده می‌شوند.

فرض کنید یک مدل کاربر (User) دارید و می‌خواهید نام کاربر همیشه با حرف اول بزرگ نمایش داده شود.
protected function name(): Attribute
{
return Attribute::make(
get: fn ($value) => ucfirst($value)
);
}

در این مثال، هر زمانی که به ویژگی name مدل User دسترسی پیدا کنید، مقدار آن با حرف اول بزرگ برگردانده می‌شود.

2- Mutators (تغییر‌دهنده‌ها)
برای تغییر و اصلاح داده‌ها قبل از ذخیره‌سازی در دیتابیس استفاده می‌شوند.

فرض کنید می‌خواهید مطمئن شوید که هر زمان ایمیل کاربر ذخیره می‌شود، به حروف کوچک تبدیل شود.
protected function email(): Attribute
{
return Attribute::make(
set: fn ($value) => strtolower($value)
);
}

در این مثال، هر زمانی که ایمیلی به مدل User اختصاص داده می‌شود، قبل از ذخیره‌سازی به حروف کوچک تبدیل خواهد شد.

3- ترکیب Accessors و Mutators
در بسیاری از موارد، شما می‌توانید Accessors و Mutators را در یک متد به صورت ترکیبی استفاده کنید. یعنی یک متد هم می‌تواند داده‌ها را هنگام دسترسی تغییر دهد (Accessor) و هم هنگام ذخیره‌سازی (Mutator).

فرض کنید می‌خواهید نام کاربر هنگام دسترسی به آن با حرف بزرگ و هنگام ذخیره‌سازی با حروف کوچک مدیریت شود.
protected function name(): Attribute
{
return Attribute::make(
get: fn ($value) => ucfirst($value),
set: fn ($value) => strtolower($value)
);
}

در این مثال، نام کاربر هنگام بازیابی از دیتابیس با حرف بزرگ نمایش داده می‌شود، اما قبل از ذخیره به حروف کوچک تبدیل می‌شود.

4- استفاده از Accessors و Mutators
هنگامی که Accessors و Mutators تعریف می‌شوند، شما می‌توانید به‌طور معمول از ویژگی‌های مدل استفاده کنید.
$user = new User();
$user->name = 'jane doe';
echo $user->name; // Jane doe


5- روش قدیمی (ورژن 8 به قبل)
در روش قدیمی، برای تعریف Accessors و Mutators باید از متدهای
get{AttributeName}Attribute و set{AttributeName}Attribute
استفاده می‌کردید.
public function getNameAttribute($value)
{
return ucfirst($value);
}

public function setEmailAttribute($value)
{
$this->attributes['email'] = strtolower($value);
}

اما در استفاده با روش جدید یکسان است.

🔖 #Laravel, #PHP, #لاراول, #فصل_۴

👤 AmirHossein

💎 Channel: @DevelopixLaravel
8👍2
⚜️ دوره لاراول - قسمت پونزدهم
📚 مینی پروژه TODo App - دیتابیس و مدل ها

خلاصه :
توی این ویدیو مینی پروژه ToDo اپ رو استارت زدیم و نگاهی به فرانت انداختیم و دیتابیس رو دراوردیم و migration و model ها رو اوکی کردیم.
توی قسمت های بعدی میریم سراغ ادامه مینی پروژه....

🎞 لینک ویدیو:
https://youtu.be/0LpM4QDAkDw

🔗 Github Repo

🔖 #Laravel, #PHP, #لاراول

👤 Matin Soleymani

💎 Channel: @DevelopixLaravel
7
فصل چهار - مدل‌ها و Eloquent ORM

بخش هفتم - Events


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

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

لیست رویدادهای Eloquent

1- رویداد retrieved
بعد از اینکه یک مدل از دیتابیس بازیابی شد، اجرا می‌شود.

2- رویداد creating
قبل از ایجاد یک رکورد جدید در دیتابیس اجرا می‌شود.

3- رویداد created
بعد از ایجاد یک رکورد جدید اجرا می‌شود.

4- رویداد updating
قبل از به‌روزرسانی یک رکورد اجرا می‌شود.

5- رویداد updated
بعد از به‌روزرسانی یک رکورد اجرا می‌شود.

6- رویداد saving
قبل از ذخیره‌شدن (چه ایجاد و چه به‌روزرسانی) یک مدل اجرا می‌شود.

7- رویداد saved
بعد از ذخیره‌شدن یک مدل اجرا می‌شود.

8- رویداد deleting
قبل از حذف یک رکورد اجرا می‌شود.

9- رویداد deleted
بعد از حذف یک رکورد اجرا می‌شود.

10- رویداد restoring
قبل از بازگردانی یک رکورد حذف‌شده اجرا می‌شود.

11- رویداد restored
بعد از بازگردانی یک رکورد حذف‌شده اجرا می‌شود.

12- رویداد trashed
بعد از soft delete شدن یک رکورد اجرا می شود.

13- رویداد forceDeleting
قبل از حذف کامل حتی با وجود soft delete اجرا می شود.

14- رویداد forceDeleted
بعد از حذف کامل حتی با وجود soft delete اجرا می شود.

15- رویداد replicating
قبل از replicate شدن یک رکورد اجرا می شود.

برای استفاده از رویدادها در Eloquent، شما می‌توانید از متد boot() در مدل خود استفاده کنید و در آن رویدادهای دلخواه را تعریف کنید.
protected static function boot()
{
parent::boot();
static::creating(function ($user) {
Log::info('Creating new user: ' . $user->name);
});

static::created(function ($user) {
Log::info('New user Created: ' . $user->name);
});
}


در این مثال:
در رویداد creating، لاگ مربوط به زمانی که یک کاربر جدید در حال ایجاد است ثبت می‌شود.
در رویداد created، لاگ مربوط به زمانی که یک کاربر با موفقیت ایجاد شد ثبت می‌شود.

🔖 #Laravel, #PHP, #لاراول, #فصل_۴

👤 AmirHossein

💎 Channel: @DevelopixLaravel
4👍4
⚜️ دوره لاراول - قسمت شانزدهم
📚 مینی پروژه TODo App - سیستم احراز هویت

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

🎞 لینک ویدیو:
https://youtu.be/Gm1skaf3UyQ

🔗 Github Repo

🔖 #Laravel, #PHP, #لاراول

👤 Matin Soleymani

💎 Channel: @DevelopixLaravel
1👍1🔥1
فصل چهار - مدل‌ها و Eloquent ORM

بخش هشتم - Observers


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

لاراول اجازه می‌دهد تا به چندین رخداد پیش‌فرض مدل گوش دهید که با آنها در بخش قبل آشنا شدیم.


برای ایجاد یک Observer جدید می‌توانید از دستور Artisan استفاده کنید:
php artisan make:observer UserObserver --model=User


این دستور یک کلاس به نام UserObserver می‌سازد و آن را با مدل User مرتبط می‌کند. پس از ایجاد، شما می‌توانید متدهایی مانند created، updated و غیره را در آن تعریف کنید تا بر اساس رخدادها اجرا شوند.

فرض کنید می‌خواهیم زمانی که یک کاربر جدید ایجاد شد، یک پیام خوش‌آمدگویی برای او ارسال شود. ابتدا یک Observer برای مدل User ایجاد می‌کنیم.
در فایل app/Observers/UserObserver.php کدی مانند زیر را اضافه می‌کنیم:

class UserObserver
{
public function created(User $user)
{
Mail::to($user->email)->send(new \App\Mail\WelcomeMail($user));
}
}


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

باید این Observer را در AppServiceProvider یا هر جای دیگری که مناسب است، ثبت کنید. این کار معمولاً در متد boot انجام می‌شود:
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
User::observe(UserObserver::class);
}
}


اکنون، هر بار که یک شیء جدید از مدل User ایجاد شود، متد created در UserObserver فراخوانی می‌شود و ایمیل خوش‌آمدگویی ارسال می‌شود.

🔖 #Laravel, #PHP, #لاراول, #فصل_۴

👤 AmirHossein

💎 Channel: @DevelopixLaravel
6👍2