لارافيل, Others / 2024-09-15

ما هو SoftDelete في Laravel وكيفية إستعادة السجلات وحذفها بشكل نهائي، وكيفية إضافتها للـ route مباشرة.

ما هو SoftDelete في Laravel وكيفية إستعادة السجلات وحذفها بشكل نهائي، وكيفية إضافتها للـ route مباشرة.

2024-09-15 وقت القراءه : 2 دقائق

واحدة من أفضل المميزات التي يوفرها إطار العمل لارافيل، هي ميزة softDelete حيث لا يتم حذف السجل من قاعدة البيانات، بل يتم إضافة حقل deleted_at إلى الجدول وتكون القيمة الإفتراضية null، حيث إذا تم عمل حذف للسجل، يتم تعديل الحقل من null إلى وقت الحذف على شكل timestamp، فإذا كانت قيمة الحقل null ذلك يعني أن الحقل غير محذوف، أما إذا كان به تاريخ فيعني أنه محذوف، والتاريخ يكون هو تاريخ الحذف.


ولتطبيق ذلك على أي جدول، لفرض إنني أريد تفعيل ذلك على جدول articles

migration

إضافة softDelete إلى ملف migration

public function up()
{
    Schema::create('articles', function (Blueprint $table) {
        $table->id();
        $table->string('title');
        $table->softDeletes();
        $table->timestamps();
    });
}

إذا كان جدول articles موجود مسبقاً، وأريد إضافة softDelete لجدول تم إنشاؤه مسبقاً

php artisan make:migration add_soft_deletes_to_article_table --table="articles"
public function up()
{
    Schema::table('articles', function (Blueprint $table) {
        $table->softDeletes();
    });
}

تنفيذ الأمر

php artisan migrate

وبذلك يتم إضافة الحقل deleted_at للجدول articles

تحضير model

في articles model إضافة

class Article extends Model
{
    use HasFactory;

    use SoftDeletes;
    protected $dates = ['deleted_at'];
}


جلب البيانات

Route::get('/article/{article}', function ($article) {
    return Article::->findOrFail($article);
});


جلب البيانات المحذوفة

أما إذا أردنا أن يتم جلب البيانات مع البيانات المحذوفة، فيجب تمرير withTrashed

Route::get('/article/{article}', function ($article) {
    return Article::withTrashed()->findOrFail($article);
});

وبذلك نحصل على البيانات حتى المحذوفة منها.


عرض السجلات المحذوفة فقط

لعرض السجلات المحذوفه يمكن إستخدام دالة onlyTrashed

$article=Article::onlyTrashed()->get();
return $article;


إستعادة السجلات المحذوفة المحذوفة

لإستعادة السجلات، يمكن إستخدام الدالة restore

لإستعادة جميع السجلات المحذوفة

Article::onlyTrashed()->restore();

ولإستعادة سجل معين

Route::get('/article/{article}', function ($article) {
    return Article::withTrashed()->findOrFail($article)->restore();
});


حذف السجلات بشكل كامل

كما نعلم أنه لا يتم حذف السجل بشكل كامل، بل يتم إضافة timestamp لحقل deleted_at، أما لحذفه بشكل كامل

Article::onlyTrashed()->forceDelete();
Article::onlyTrashed()->where('deleted_at', '<', Carbon::subDays(30))->forceDelete();
Product::onlyTrashed()->find(2)->forceDelete();


إضافة withTrashed للـ route

لكن في لارافيل 8.55 يمكن تمرير دالة withTrashed للـ route مباشرة

Route::get('/article/{article}', function (Article $article) {
    return $article;
})->withTrashed();
{
    "id": 3,
    "title": "Sed iusto eius quis.",
    "created_at": "2021-09-11T07:59:39.000000Z",
    "updated_at": "2021-09-11T10:14:39.000000Z",
    "deleted_at": "2021-09-11T10:14:39.000000Z"
}

التعليقات
زائر
منذ 3 سنوات

استمر انت اضافة قوية جداااا للمحتوى العربي ربنا يجازيك خير

زائر
منذ 3 سنوات

ربنا يجزيك كل انا متابع كل درس تنشره ومستفيد جدا أستمر ربنا يباركلك

زائر
منذ 3 سنوات

بارك الله فيك

علي حسن
منذ 3 سنوات

ممتاز ياهندسه

nahla ayoub
منذ سنتين

اشكرك على الاسلوب السهل والمباشر والامثلة كتير واضحة استمر نفعك الله ونفع بك

زائر
منذ سنة

بستفيد جدا اتمني المجتوي يستمر متاح ديما وتزيد عليه ربنا يبارك في حضرتك

إضافة تعليق
Loading...