سطل زباله مطالب در لاراول با SoftDeletes
SoftDeletes یکی دیگه از اون trait های جالب توی لاراول هست که به شما امکان میده مثل سیستم های مدیریت محتوای وردپرس و جوملا ، برای قسمت های مختلف پروژه خودتون مثل بخش مطالب ، کاربران و ... یک سطل زباله ایجاد کنید!! با ساختن این سطل زباله بجای اینکه مثلا مطالب خودتونو یکدفعه با متد delete حذف کنید و از دیتابیس پاک کنید ، اون مطالب رو میفرستید به سطل زباله و از دیتابیس شما چیزی حذف نمیشه و هر وقت که مایل بودید میتونید کامل حذف کنید و یا restore کنید و مطالب رو برگردونید.به این کار تو لاراول میگیم SoftDelete یعنی همون حذف کردن نرم!
مطلب پیشنهادی: آموزش رایگان لاراول
شرح عملکرد softDeletes
فرض کنید ما قصد داریم روی جدول مطالب خودمون softDelete رو اعمال کنیم.برای اینکار باید یک فیلد به اسم deleted_at به این جدول اضافه کنیم.بعد از اینکار توی کنترلر خودتون زمان استفاده از متد delete بجای اینکه مطلب شما حذف بشه ، فیلد deleted_at با یک مقدار تاریخ پر میشه ! اینجاست که ما میفهمیم این مطلب جز trash شده است.اگر هم خواستیم کامل از دیتابیس حذفش کنیم بجای متد delete از forceDelete استفاده میکنیم که توی این آموزش همه ی این موارد رو توضیح میدم.
ساخت فیلد deleted_at
در ابتدا باید روی جدولی که میخاید این ویژگی رو براش ایجاد کنید یک فیلد اضافه تعریف کنید به اسم deleted_at که البته میتونید یک migration به صورت زیر بسازید که خودش اینکارو برای شما روی جدول مربوطه انجام میده:
Schema::table('articles', function (Blueprint $table) {
$table->softDeletes();
});
دقت کنید که اگه خودتونو به صورت دستی فیلد deleted_at رو خواستید بسازید باید از نوع timestamp باشه
تغییرات در model
بعد از اضافه کردن فیلد deleted_at حالا باید trait softDeletes رو در model خودتون use کنید.به کدهای زیر دقت کنید که ما در model مربوط به ArticleModel خودمون اینکار انجام دادیم:
namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Article extends Model
{
use SoftDeletes;
}
خب کار تموم شده و از این به بعد هرجا متد delete رو استفاده کنید لاراول مطلب شما رو بجای حذف کردن ، فقط مقدار تاریخ در فیلد deleted_at ثبت میکنه و توی کوئری های شما نمایش نمیده!
حالا اگر خواستید که توی لیست مطالب خودتون ، اون مطالبی رو هم که softDelete شده رو هم بیارید و نمایش بدید ، باید به صورت زیر eloquent استفاده کنید:
$articles = App\Article::withTrashed()->get();
و اگر خواستید که فقط مطالبی که softDelete شده است رو نشون بدید از eloquent زیر استفاده کنید:
$articles = App\Article::onlyTrashed()->get();
اگر خواستید که یک مطلب رو از softDelete خارج کنید و مجدد بازیابی کنید و برگردونید به مطالب اصلی از متد restore میتونید به صورت زیر استفاده کنید:
App\Article::withTrashed()
->where('id', 1)
->restore();
تو مثال بالا ما مطلب با آی دی 1 رو restore کردیم.با اینکار مقدار موجود در فیلد deleted_at پاک میشه! به همین راحتی
و در آخر اگر نیاز بود که مطلبی رو حتما و حتما پاک کنید و از دیتابیس هم پاک بشه خیلی راحت و ساده متد forceDelete رو بجای delete استفاده کنید و تامام!
$article->forceDelete();
هاست لاراول: هاست لاراول