واحدة من أفضل المميزات التي يوفرها إطار العمل لارافيل، هي ميزة 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"
}
بستفيد جدا اتمني المجتوي يستمر متاح ديما وتزيد عليه ربنا يبارك في حضرتك
اشكرك على الاسلوب السهل والمباشر والامثلة كتير واضحة استمر نفعك الله ونفع بك
ممتاز ياهندسه
بارك الله فيك
ربنا يجزيك كل انا متابع كل درس تنشره ومستفيد جدا أستمر ربنا يباركلك
استمر انت اضافة قوية جداااا للمحتوى العربي ربنا يجازيك خير