私の推測では、次の構文を使用することでした。
MyModel::all()->delete();
しかし、それはうまくいきませんでした。とても簡単だと思いますが、この件に関するドキュメントを検索しましたが、見つかりません!
MyModel::all()->delete()
が機能しない理由は、all()
が実際にクエリを起動し、Eloquentオブジェクトのコレクションを返すためです。
Truncateメソッドを使用できます。これはLaravel 4および5で機能します。
MyModel::truncate();
これにより、個々の行の削除を記録することなく、テーブルからすべての行が削除されます。
Laravel 5.2 +ソリューション。
Model::getQuery()->delete();
基礎となるビルダーをテーブル名で取得し、何でもします。それよりも整頓できませんでした。
Laravel 5.6ソリューション
\App\Model::query()->delete();
foreign_key_checks
を無効にすると、Model::truncate()
を使用できます(MySQLを使用すると仮定します)。
DB::statement("SET foreign_key_checks=0");
Model::truncate();
DB::statement("SET foreign_key_checks=1");
両方の方法がシードファイルで使用されているのを見てきました。
// Uncomment the below to wipe the table clean before populating
DB::table('table_name')->truncate();
//or
DB::table('table_name')->delete();
外部キーを設定したい場合、最初のものを使用することはできません。
外部キー制約で参照されているテーブルを切り捨てることはできません
したがって、2番目のものを使用することをお勧めします。
間接的な方法があります:
myModel:where('anyColumnName', 'like', '%%')->delete();
例:
User:where('id', 'like' '%%')->delete();
Laravelクエリビルダー情報: https://laravel.com/docs/5.4/queries
Google経由でこのスレッドにアクセスする人のために、別のオプションを追加したかったのです。これを実現する必要がありましたが、truncate()
がリセットする自動インクリメント値を保持したかったのです。また、モデルオブジェクトから直接操作したいため、DB::
を使用したくありませんでした。だから、私はこれで行きました:
Model::whereNotNull('id')->delete();
当然、列は実際に存在する必要がありますが、標準のすぐに使えるEloquentモデルでは、id
列は存在し、決してヌルではありません。これが最良の選択かどうかはわかりませんが、私の目的には役立ちます。
Laravel 3
でこの操作を実行するための最良の方法は、以下に示すように、Fluent
インターフェイスを使用してテーブルを切り捨てることです。
DB::query("TRUNCATE TABLE mytable");
エラーになるため、Model::truncate()
を使用できませんでした。
SQLSTATE [42000]:構文エラーまたはアクセス違反:1701外部キー制約で参照されているテーブルを切り捨てることはできません
残念ながらModel::delete()
は機能しません(少なくともLaravel 5.0では):
非静的メソッドIlluminate\Database\Eloquent\Model :: delete()は、互換性のないコンテキストからの$ thisを想定して、静的に呼び出すべきではありません
しかし、これは機能します:
(new Model)->newQuery()->delete()
ソフト削除を設定している場合、すべての行がソフト削除されます。ソフト削除された行を含むすべての行を完全に削除するには、これに変更できます。
(new Model)->newQueryWithoutScopes()->forceDelete()
これを行うことにより、Eloquentの力をさらに活用することもできます。
MyModel::get()->each->delete();
また、ソフト削除を保持するこのワンライナーを試すことができます:
Model::whereRaw('1=1')->delete();
Travis vignonの答えと同様に、雄弁なモデルのデータが必要でした。条件が正しければ、モデルを削除または更新する必要がありました。クエリによって返されたフィールドの最小値と最大値(選択基準を満たす別のフィールドがテーブルに追加された場合)と元の選択基準を取得して、1つの生のSQLクエリを介してフィールドを更新しました(コレクション内のオブジェクトごとに1つの雄弁なクエリとは対照的に)。
生のSQLの使用がlaravelsの美しいコード哲学に違反することは知っていますが、1つの代わりに数百のクエリを処理するのは難しいでしょう。
外部キーの制約があるLumen 5.5を使用するソリューション:
$categories = MusicCategory::all();
foreach($categories as $category)
{
$category->delete();
}
return response()->json(['error' => false]);
foreach loopも実行できます。
$collection = Model::get();
foreach($collection as $c) {
$c->delete();
}