web-dev-qa-db-ja.com

Eloquentを使用してテーブル内のすべての行を削除する方法は?

私の推測では、次の構文を使用することでした。

MyModel::all()->delete();

しかし、それはうまくいきませんでした。とても簡単だと思いますが、この件に関するドキュメントを検索しましたが、見つかりません!

104
Pete

MyModel::all()->delete()が機能しない理由は、all()が実際にクエリを起動し、Eloquentオブジェクトのコレクションを返すためです。

Truncateメソッドを使用できます。これはLaravel 4および5で機能します。

MyModel::truncate();

これにより、個々の行の削除を記録することなく、テーブルからすべての行が削除されます。

212
bilalq

Laravel 5.2 +ソリューション。

Model::getQuery()->delete();

基礎となるビルダーをテーブル名で取得し、何でもします。それよりも整頓できませんでした。

Laravel 5.6ソリューション

\App\Model::query()->delete();
55

foreign_key_checksを無効にすると、Model::truncate()を使用できます(MySQLを使用すると仮定します)。

DB::statement("SET foreign_key_checks=0");
Model::truncate();
DB::statement("SET foreign_key_checks=1");
51
Fortex

両方の方法がシードファイルで使用されているのを見てきました。

// Uncomment the below to wipe the table clean before populating

DB::table('table_name')->truncate();

//or

DB::table('table_name')->delete();

外部キーを設定したい場合、最初のものを使用することはできません。

外部キー制約で参照されているテーブルを切り捨てることはできません

したがって、2番目のものを使用することをお勧めします。

28

間接的な方法があります:

myModel:where('anyColumnName', 'like', '%%')->delete();

例:

User:where('id', 'like' '%%')->delete();

Laravelクエリビルダー情報: https://laravel.com/docs/5.4/queries

12
Rejaul

Google経由でこのスレッドにアクセスする人のために、別のオプションを追加したかったのです。これを実現する必要がありましたが、truncate()がリセットする自動インクリメント値を保持したかったのです。また、モデルオブジェクトから直接操作したいため、DB::を使用したくありませんでした。だから、私はこれで行きました:

Model::whereNotNull('id')->delete();

当然、列は実際に存在する必要がありますが、標準のすぐに使えるEloquentモデルでは、id列は存在し、決してヌルではありません。これが最良の選択かどうかはわかりませんが、私の目的には役立ちます。

8
lookitsatravis

Laravel 3でこの操作を実行するための最良の方法は、以下に示すように、Fluentインターフェイスを使用してテーブルを切り捨てることです。

DB::query("TRUNCATE TABLE mytable");
4
Pete

エラーになるため、Model::truncate()を使用できませんでした。

SQLSTATE [42000]:構文エラーまたはアクセス違反:1701外部キー制約で参照されているテーブルを切り捨てることはできません

残念ながらModel::delete()は機能しません(少なくともLaravel 5.0では):

非静的メソッドIlluminate\Database\Eloquent\Model :: delete()は、互換性のないコンテキストからの$ thisを想定して、静的に呼び出すべきではありません

しかし、これは機能します:

(new Model)->newQuery()->delete()

ソフト削除を設定している場合、すべての行がソフト削除されます。ソフト削除された行を含むすべての行を完全に削除するには、これに変更できます。

(new Model)->newQueryWithoutScopes()->forceDelete()
4

これを行うことにより、Eloquentの力をさらに活用することもできます。

MyModel::get()->each->delete();
3
Mattias Geniar

また、ソフト削除を保持するこのワンライナーを試すことができます:

Model::whereRaw('1=1')->delete();
1
jfeid

Travis vignonの答えと同様に、雄弁なモデルのデータが必要でした。条件が正しければ、モデルを削除または更新する必要がありました。クエリによって返されたフィールドの最小値と最大値(選択基準を満たす別のフィールドがテーブルに追加された場合)と元の選択基準を取得して、1つの生のSQLクエリを介してフィールドを更新しました(コレクション内のオブジェクトごとに1つの雄弁なクエリとは対照的に)。

生のSQLの使用がlaravelsの美しいコード哲学に違反することは知っていますが、1つの代わりに数百のクエリを処理するのは難しいでしょう。

0
Sidney

外部キーの制約があるLumen 5.5を使用するソリューション:

$categories = MusicCategory::all();
foreach($categories as $category)
{
$category->delete();

}
return response()->json(['error' => false]);
0
Alain Berrier

foreach loopも実行できます。

$collection = Model::get();

foreach($collection as $c) {

$c->delete();

}
0
Sam Solomon