Laravel Soft Delete posts

Posted on

Laravel Soft Delete posts – Here in this article, we will share some of the most common and frequently asked about PHP problem in programming with detailed answers and code samples. There’s nothing quite so frustrating as being faced with PHP errors and being unable to figure out what is preventing your website from functioning as it should like php and laravel . If you have an existing PHP-based website or application that is experiencing performance issues, let’s get thinking about Laravel Soft Delete posts.

in our project we must be use soft delete for each posts. in laravel document i think we can only use this feature for tables.

can we use that for posts on table such as

$id = Contents::find($id);
$id->softDeletes();

Solution :

Updated Version (Version 5.0 & Later):

use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseEloquentSoftDeletes;

class Post extends Model {

    use SoftDeletes;

    protected $table = 'posts';

    // ...
}

When soft deleting a model, it is not actually removed from your
database. Instead, a deleted_at timestamp is set on the record. To
enable soft deletes for a model, specify the softDelete property on
the model (Documentation).

For (Version 4.2):

use IlluminateDatabaseEloquentSoftDeletingTrait; // <-- This is required

class Post extends Eloquent {

    use SoftDeletingTrait;

    protected $table = 'posts';

    // ...
}

Prior to Version 4.2 (But not 4.2 & Later)

For example (Using a posts table and Post model):

class Post extends Eloquent {

    protected $table = 'posts';
    protected $softDelete = true;
    
    // ...
}

To add a deleted_at column to your table, you may use the softDeletes
method from a migration:

For example (Migration class’ up method for posts table) :

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::create('posts', function(Blueprint $table)
    {
        $table->increments('id');
        // more fields
        $table->softDeletes(); // <-- This will add a deleted_at field
        $table->timeStamps();
    });
}

Now, when you call the delete method on the model, the deleted_at column will be set to the current timestamp. When querying a model that uses soft deletes, the “deleted” models will not be included in query results. To soft delete a model you may use:

$model = Contents::find( $id );
$model->delete();

Deleted (soft) models are identified by the timestamp and if deleted_at field is NULL then it’s not deleted and using the restore method actually makes the deleted_at field NULL. To permanently delete a model you may use forceDelete method.

You actually do the normal delete. But on the model you specify that its a softdelete model.

So on your model add the code:

class Contents extends Eloquent {

    use SoftDeletingTrait;

    protected $dates = ['deleted_at'];

}

Then on your code do the normal delete like:

$id = Contents::find( $id );
$id ->delete();

Also make sure you have the deleted_at column on your table.

Or just see the docs: http://laravel.com/docs/eloquent#soft-deleting

I just did this with Laravel 8 and it worked. It’s basically what @The alpha said, but trying to wrap everything quicker. Follow this steps.

In the migration file add:

$table->softDeletes();

In the model:

use IlluminateDatabaseEloquentSoftDeletes;

class User extends Model
{
    use SoftDeletes;
    ...
];

}

In the controller:

$user->delete();

Bonus: if you need to restore the deleted user

User::withTrashed()->find($id);->restore();

Just an update for Laravel 5:

In Laravel 4.2:

use IlluminateDatabaseEloquentSoftDeletingTrait;    
class Post extends Eloquent {

    use SoftDeletingTrait;

    protected $dates = ['deleted_at'];

}

becomes in Laravel 5:

use IlluminateDatabaseEloquentSoftDeletes;

class User extends Model {

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

In Laravel 5.5 Soft Deleted works ( for me ).

Data Base

deleted_at Field, default NULL value

Model

use IlluminateDatabaseEloquentSoftDeletes;

class User extends Model {
    use SoftDeletes;
}

Controller

public function destroy($id)
{
    User::find($id)->delete();
}

In the Latest version of Laravel i.e above Laravel 5.0. It is quite simple to perform this task.
In Model, inside the class just write ‘use SoftDeletes’. Example

<?php

namespace App;

use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseEloquentSoftDeletes;

class User extends Model
{
    use SoftDeletes;
}

And In Controller, you can do deletion. Example

User::where('email', 'youremail@example.com')->delete();

or

User::where('email', 'youremail@example.com')->softDeletes();

Make sure that you must have ‘deleted_at’ column in the users Table.

Here is the details from laravel.com

http://laravel.com/docs/eloquent#soft-deleting

When soft deleting a model, it is not actually removed from your database. Instead, a deleted_at timestamp is set on the record. To enable soft deletes for a model, specify the softDelete property on the model:

class User extends Eloquent {

    protected $softDelete = true;

}

To add a deleted_at column to your table, you may use the softDeletes method from a migration:

$table->softDeletes();

Now, when you call the delete method on the model, the deleted_at column will be set to the current timestamp. When querying a model that uses soft deletes, the “deleted” models will not be included in query results.

Leave a Reply

Your email address will not be published. Required fields are marked *