Search code examples
laravelsoft-delete

Questions related to soft delete in laravel


I have some questions relating to soft delete in laravel. I have search up on what it does and what it means and the most understandable part about soft delete is from this sentence

"When models are soft deleted, they are not actually removed from your database. Instead, a deleted_at attribute is set on the model and inserted into the database. If a model has a non-null deleted_at value, the model has been soft deleted. To enable soft deletes for a model, use the Illuminate\Database\Eloquent\SoftDeletes trait on the model and add the deleted_at column to your $dates property:"

So here are my questions based from that sentence:

Q1:

So when I use soft delete in my code, and when I try to delete some data, does the data in the view page(blade.php) disappear while the database still contain those data?

Q2:

I saw some people using something called static::deleting, I don't really quite get how this work? Could you explain what it does? Thank you

Q3:

How do you delete data using soft delete? I saw people just putting some stuff into their model instead of using button, so does that mean you can only delete it manually inside the model instead of just clicking the delete button in the view page?


Solution

  • Question 1

    By default: Yes.
    It depends on your query. When using soft deletes, Laravel will query all models that are not soft-deleted by default. When you also want to get the soft-deleted models, you need to call the withTrashed() method on your query. Read more here:
    https://laravel.com/docs/5.5/eloquent#querying-soft-deleted-models

    To understand what withTrashed() does, you need to understand how soft-deleting works. Soft-deleting models works by adding a new column to your database tables called deleted_at. It's value defaults to null. When you soft-delete a model, Laravel will put the current timestamp into that column. Therefore, this field doesn't contain a null value anymore.

    When querying models when using soft-deletes, Laravel appends a deleted_at is null condition to the query. Calling the withTrashed() method, removes that condition from the query.

    Have a look on the source of the default query modifier and the withTrashed method.


    Question 2

    That are events. You can call that to tell Laravel, that it should execute that specific closure when this event happens. In your example, it is listening for the "deleting" event. See more on that here:
    https://laravel.com/docs/5.5/eloquent#events


    Question 3

    You can entirely delete soft-deletable models with the forceDelete() method. See "Permanently Deleting Models" here:
    https://laravel.com/docs/5.5/eloquent#querying-soft-deleted-models