Reputation: 7579
My guess was to use the following syntax:
MyModel::all()->delete();
But that did not work. I'm sure it's super simple, but I've searched for documentation on the subject and can't find it!
Upvotes: 224
Views: 332923
Reputation: 21
For those that want to use the truncate method, but have foreign key constraints, you may now bypass that using:
Schema::disableForeignKeyConstraints()
Model::truncate();
Schema::enableForeignKeyConstraints()
This has been around for a few years, but I'm not sure of exactly when it was introduced.
Upvotes: 2
Reputation: 77
MyModel::truncate();
in command line :
php artisan tinker
then
Post::truncate();
Upvotes: 2
Reputation: 478
The problem with truncate
is that it implies an immediate commit,
so if use it inside a transaction the risk is that you find the table empty.
The best solution is to use delete
MyModel::query()->delete();
Upvotes: 6
Reputation: 646
In my case laravel 4.2 delete all rows ,but not truncate table
DB::table('your_table')->delete();
Upvotes: -1
Reputation: 71
You can try this one-liner which preserves soft-deletes also:
Model::whereRaw('1=1')->delete();
Upvotes: 7
Reputation: 10912
Laravel 5.2+ solution.
Model::getQuery()->delete();
Just grab underlying builder with table name and do whatever. Couldn't be any tidier than that.
Laravel 5.6 solution
\App\Model::query()->delete();
Upvotes: 128
Reputation: 8321
I've seen both methods been used in seed files.
// Uncomment the below to wipe the table clean before populating
DB::table('table_name')->truncate();
//or
DB::table('table_name')->delete();
Even though you can not use the first one if you want to set foreign keys.
Cannot truncate a table referenced in a foreign key constraint
So it might be a good idea to use the second one.
Upvotes: 52
Reputation: 7679
The reason MyModel::all()->delete()
doesn't work is because all()
actually fires off the query and returns a collection of Eloquent objects.
You can make use of the truncate method, this works for Laravel 4 and 5:
MyModel::truncate();
That drops all rows from the table without logging individual row deletions.
Upvotes: 433
Reputation: 980
There is an indirect way:
myModel:where('anyColumnName', 'like', '%%')->delete();
Example:
User:where('id', 'like' '%%')->delete();
Laravel query builder information: https://laravel.com/docs/5.4/queries
Upvotes: 13
Reputation: 5298
I wasn't able to use Model::truncate()
as it would error:
SQLSTATE[42000]: Syntax error or access violation: 1701 Cannot truncate a table referenced in a foreign key constraint
And unfortunately Model::delete()
doesn't work (at least in Laravel 5.0):
Non-static method Illuminate\Database\Eloquent\Model::delete() should not be called statically, assuming $this from incompatible context
But this does work:
(new Model)->newQuery()->delete()
That will soft-delete all rows, if you have soft-delete set up. To fully delete all rows including soft-deleted ones you can change to this:
(new Model)->newQueryWithoutScopes()->forceDelete()
Upvotes: 9
Reputation: 781
You can use Model::truncate()
if you disable foreign_key_checks
(I assume you use MySQL).
DB::statement("SET foreign_key_checks=0");
Model::truncate();
DB::statement("SET foreign_key_checks=1");
Upvotes: 78
Reputation: 708
In a similar vein to Travis vignon's answer, I required data from the eloquent model, and if conditions were correct, I needed to either delete or update the model. I wound up getting the minimum and maximum I'd field returned by my query (in case another field was added to the table that would meet my selection criteria) along with the original selection criteria to update the fields via one raw SQL query (as opposed to one eloquent query per object in the collection).
I know the use of raw SQL violates laravels beautiful code philosophy, but itd be hard to stomach possibly hundreds of queries in place of one.
Upvotes: -1
Reputation: 712
I wanted to add another option for those getting to this thread via Google. I needed to accomplish this, but wanted to retain my auto-increment value which truncate()
resets. I also didn't want to use DB::
anything because I wanted to operate directly off of the model object. So, I went with this:
Model::whereNotNull('id')->delete();
Obviously the column will have to actually exists, but in a standard, out-of-the-box Eloquent model, the id
column exists and is never null. I don't know if this is the best choice, but it works for my purposes.
Upvotes: 15
Reputation: 7579
The best way for accomplishing this operation in Laravel 3
seems to be the use of the Fluent
interface to truncate the table as shown below
DB::query("TRUNCATE TABLE mytable");
Upvotes: 4