回答:
MyModel::all()->delete()
動作しない理由は、all()
実際にクエリを実行してEloquentオブジェクトのコレクションを返すためです。
あなたはtruncateメソッドを利用することができます、これはLaravel 4と5で動作します:
MyModel::truncate();
個々の行の削除をログに記録せずに、テーブルからすべての行を削除します。
MyModel::all()->delete()
、foreach (MyModel::all() as $e) { $e->delete() }
Laravel 5.2以降のソリューション。
Model::getQuery()->delete();
基礎となるビルダーをテーブル名で取得し、何でも行います。それ以上の整然としたことはできませんでした。
Laravel 5.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番目のものを使用することをお勧めします。
delete
明らかに同じではありませんtruncate
。
間接的な方法があります:
myModel:where('anyColumnName', 'like', '%%')->delete();
例:
User:where('id', 'like' '%%')->delete();
Laravelクエリビルダー情報:https : //laravel.com/docs/5.4/queries
DELETE FROM users WHERE id LIKE '%%'
は、テーブル内のすべての行に一致するSQL を実行し、すべてを削除します。
whereIn
方法を: $itemsAllContentIDs = Item::where('user_id', $userId)->pluck('item_content_id')->all();
ItemsContent::whereIn('id', $itemsAllContentIDs)->delete();
Google経由でこのスレッドにアクセスする人のために、別のオプションを追加したいと思いました。これを達成する必要がありましたが、truncate()
リセットする自動インクリメント値を保持したいと考えました。またDB::
、モデルオブジェクトから直接操作する必要があるため、何も使用しませんでした。だから、私はこれで行きました:
Model::whereNotNull('id')->delete();
当然、列は実際に存在する必要がありますが、標準の標準のEloquentモデルでは、id
列が存在し、nullになることはありません。これが最良の選択かどうかはわかりませんが、私の目的には適しています。
Model::delete();
同じことを達成します。
Model::delete()
例外がスローさNon-static method Illuminate\Database\Eloquent\Model::delete() should not be called statically
れます。
Model::truncate()
エラーになるので使用できませんでした:
SQLSTATE [42000]:構文エラーまたはアクセス違反:1701外部キー制約で参照されているテーブルを切り捨てることはできません
そして、残念ながらModel::delete()
動作しません(少なくともLaravel 5.0では):
非互換メソッドから$ thisを想定して、非静的メソッドIlluminate \ Database \ Eloquent \ Model :: delete()を静的に呼び出さないでください
しかし、これは機能します:
(new Model)->newQuery()->delete()
ソフト削除が設定されている場合は、すべての行がソフト削除されます。論理的に削除された行を含むすべての行を完全に削除するには、次のように変更できます。
(new Model)->newQueryWithoutScopes()->forceDelete()
できる foreachループも..
$collection = Model::get();
foreach($collection as $c) {
$c->delete();
}