私の推測では、次の構文を使用することでした。
MyModel::all()->delete();
しかし、それはうまくいきませんでした。とてもシンプルだと思いますが、このテーマに関するドキュメントを検索しましたが、見つかりませんでした。
MyModel::all()->delete()
動作しない理由は、all()
実際にクエリを実行してEloquentオブジェクトのコレクションを返すためです。
切り捨て方法を利用できます。これはLaravel4および5で機能します。
MyModel::truncate();
これにより、個々の行の削除をログに記録せずに、テーブルからすべての行が削除されます。
Laravel5.2+ソリューション。
Model::getQuery()->delete();
テーブル名で基礎となるビルダーを取得し、何でもします。それよりもきちんとしたものになることはできませんでした。
Laravel5.6ソリューション
\App\Model::query()->delete();
Model::truncate()
無効にすると使用できforeign_key_checks
ます(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
列は存在し、nullになることはありません。これが最良の選択かどうかはわかりませんが、私の目的には役立ちます。
Model::truncate()
エラーが発生するため、使用できませんでした。
SQLSTATE [42000]:構文エラーまたはアクセス違反:1701外部キー制約で参照されているテーブルを切り捨てることができません
そして残念ながらModel::delete()
(少なくともLaravel 5.0では)機能しません:
非静的メソッドIlluminate\Database \ Eloquent \ Model :: delete()は、互換性のないコンテキストからの$ thisを想定して、静的に呼び出されるべきではありません。
しかし、これは機能します:
(new Model)->newQuery()->delete()
ソフト削除が設定されている場合は、すべての行がソフト削除されます。ソフト削除された行を含むすべての行を完全に削除するには、次のように変更できます。
(new Model)->newQueryWithoutScopes()->forceDelete()
簡単な解決策:
Mymodel::query()->delete();
ソフト削除も保持するこのワンライナーを試すことができます:
Model::whereRaw('1=1')->delete();
でこの操作を実行するための最良の方法は、以下に示すようLaravel 3
に、インターフェイスを使用しFluent
てテーブルを切り捨てることです。
DB::query("TRUNCATE TABLE mytable");
の問題truncate
は、それが即時コミットを意味することです。したがって、トランザクション内でそれを使用する場合、テーブルが空になるリスクがあります。最善の解決策は使用することですdelete
MyModel::query()->delete();
Travis vignonの答えと同じように、雄弁なモデルからのデータが必要でした。条件が正しければ、モデルを削除または更新する必要がありました。クエリによって返される最小および最大のフィールド(選択基準を満たす別のフィールドがテーブルに追加された場合)と、元の選択基準を取得して、1つの生のSQLクエリを介してフィールドを更新することになりました(コレクション内のオブジェクトごとに1つの雄弁なクエリとは対照的です)。
生のSQLの使用は、laravelsの美しいコード哲学に違反していることは知っていますが、1つではなく数百のクエリを実行するのは難しいでしょう。
私の場合、laravel 4.2はすべての行を削除しますが、テーブルは切り捨てません
DB :: table('your_table')-> delete();
外部キー制約のあるLumen5.5で動作するソリューション:
$categories = MusicCategory::all();
foreach($categories as $category)
{
$category->delete();
}
return response()->json(['error' => false]);