واحدة من أفضل المميزات التي يوفرها إطار العمل لارافيل، هي ميزة softDelete حيث لا يتم حذف السجل من قاعدة البيانات، بل يتم إضافة حقل deleted_at إلى الجدول وتكون القيمة الإفتراضية null، حيث إذا تم عمل حذف للسجل، يتم تعديل الحقل من null إلى وقت الحذف على شكل timestamp، فإذا كانت قيمة الحقل null ذلك يعني أن الحقل غير محذوف، أما إذا كان به تاريخ فيعني أنه محذوف، والتاريخ يكون هو تاريخ الحذف.
ولتطبيق ذلك على أي جدول، لفرض إنني أريد تفعيل ذلك على جدول articles
إضافة 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
في 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();
لكن في لارافيل 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" }
ربنا يجزيك كل انا متابع كل درس تنشره ومستفيد جدا أستمر ربنا يباركلك
بارك الله فيك
ممتاز ياهندسه
اشكرك على الاسلوب السهل والمباشر والامثلة كتير واضحة استمر نفعك الله ونفع بك
بستفيد جدا اتمني المجتوي يستمر متاح ديما وتزيد عليه ربنا يبارك في حضرتك
زائر
استمر انت اضافة قوية جداااا للمحتوى العربي ربنا يجازيك خير