181

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

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

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

4

14 に答える 14

359

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

切り捨て方法を利用できます。これはLaravel4および5で機能します。

MyModel::truncate();

これにより、個々の行の削除をログに記録せずに、テーブルからすべての行が削除されます。

于 2013-03-19T01:19:41.617 に答える
99

Laravel5.2+ソリューション。

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

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

Laravel5.6ソリューション

\App\Model::query()->delete();
于 2016-02-25T21:13:25.863 に答える
73

Model::truncate()無効にすると使用できforeign_key_checksます(MySQLを使用していると思います)。

DB::statement("SET foreign_key_checks=0");
Model::truncate();
DB::statement("SET foreign_key_checks=1");
于 2013-12-19T15:34:23.087 に答える
47

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

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

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

//or

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

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

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

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

于 2013-10-18T10:42:04.167 に答える
13

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

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

例:

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

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

于 2015-10-28T03:25:40.927 に答える
12

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

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

明らかに、列は実際に存在する必要がありますが、標準のすぐに使用可能なEloquentモデルでは、id列は存在し、nullになることはありません。これが最良の選択かどうかはわかりませんが、私の目的には役立ちます。

于 2014-05-01T20:51:33.367 に答える
8

Model::truncate()エラーが発生するため、使用できませんでした。

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

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

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

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

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

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

(new Model)->newQueryWithoutScopes()->forceDelete()
于 2016-02-25T10:48:34.473 に答える
8

簡単な解決策:

 Mymodel::query()->delete();
于 2019-09-08T15:31:12.100 に答える
6

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

Model::whereRaw('1=1')->delete();
于 2018-09-27T12:08:34.127 に答える
4

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

DB::query("TRUNCATE TABLE mytable");
于 2013-03-19T15:49:53.180 に答える
0

の問題truncateは、それが即時コミットを意味することです。したがって、トランザクション内でそれを使用する場合、テーブルが空になるリスクがあります。最善の解決策は使用することですdelete

MyModel::query()->delete();
于 2021-10-08T13:35:22.817 に答える
-1

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

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

于 2014-05-02T19:04:03.877 に答える
-1

私の場合、laravel 4.2はすべての行を削除しますが、テーブルは切り捨てません

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

于 2020-11-11T10:37:40.033 に答える
-4

外部キー制約のあるLumen5.5で動作するソリューション:

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

}
return response()->json(['error' => false]);
于 2018-02-06T18:33:59.087 に答える