چاپ / PDF
امتیاز
(12 )

سطل زباله مطالب در لاراول با SoftDeletes

سطل زباله مطالب در لاراول با SoftDeletes

سطل زباله مطالب در لاراول با 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();

هاست لاراول: هاست لاراول