Eloquent를 사용하여 테이블의 모든 행을 삭제하는 방법은 무엇입니까?


135

내 생각에는 다음 구문을 사용하는 것이 었습니다.

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

그러나 그것은 효과가 없었습니다. 나는 그것이 매우 간단하다고 확신하지만 주제에 관한 문서를 검색했는데 찾을 수 없습니다!

답변:


279

MyModel::all()->delete()작동하지 않는 이유 는 all()실제로 쿼리를 시작하고 Eloquent 객체 컬렉션을 반환 하기 때문 입니다.

잘라 내기 방법을 사용할 수 있습니다. Laravel 4 및 5에서 작동합니다.

MyModel::truncate();

개별 행 삭제를 기록하지 않고 테이블에서 모든 행을 삭제합니다.


1
미래 독자들을 위해 Laravel 3 솔루션을 내 질문에 추가했습니다.
— Pete

39
좋은. 다른 사람이 2016 년에 Google을 방문한 경우에도 Laravel 5에서도 작동합니다.
— samiles

14
참고 : truncate ()는 AUTO_INCREMENT 카운터도 재설정합니다 (외래 키 제약 조건이있는 테이블은자를 수 없습니다.)
— William Turrell

10
참고 : Turncate는 삭제 이벤트를 트리거하지 않습니다.
— Fusion

1
당신은 정말 사용하려는 경우 MyModel::all()->delete(), 사용foreach (MyModel::all() as $e) { $e->delete() }
— Ema4rl

70

라 라벨 5.2+ 솔루션.

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

테이블 이름으로 기본 빌더를 잡고 무엇이든하십시오. 그보다 더 깔끔 할 수는 없습니다.

라 라벨 5.6 솔루션

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

9
이것이 왜 작동하는지 다른 누군가가 혼란 스러울 경우 Model 클래스는 __call magic 메소드 here을 통해 메소드를 빌더에 전달합니다 . 모델 클래스 자체에는 delete 메소드가 있으므로 Model :: delete ()를 호출하면 실제로 Builder 메소드를 원할 때 Model 메소드를 호출합니다. 따라서 빌더를 명시 적으로 가져 오려면 getQuery ()를 사용할 수 있습니다.
— kevinAlbs

원하는 경우 관련 테이블도 삭제하지 않습니다.
— Terje Nesthus

그것은 소프트 삭제가 켜져 있는지 여부에 관계없이 모든 레코드를 강제로 삭제합니다
— shalini

모델 :: whereNotNull ( 'id')-> delete (); -소프트 삭제가 켜져있을 때 소프트 삭제를 수행합니다
— shalini

61

당신은 사용 Model::truncate()하지 않도록 당신이 경우에 foreign_key_checks(난 당신이 MySQL을 사용 가정).

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

2
Laravel 4에서는 DB :: 준비가 ()를 사용
— swdev

Schema :: disableForeignKeyConstraints ();를 사용할 수도 있습니다. & Schema :: enableForeignKeyConstraints ();
— Eleazar Resendez

33

두 가지 방법이 시드 파일에서 사용되는 것을 보았습니다.

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

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

//or

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

외래 키 를 설정하려면 첫 번째 키 를 사용할 수 없습니다 .

외래 키 제약 조건에서 참조되는 테이블을자를 수 없습니다

따라서 두 번째 것을 사용하는 것이 좋습니다.


2
delete분명히 같지는 않습니다 truncate.
— Joel Mellon

2
@sudopeople 차이를 지적하는 것이 정말 도움이 될 것입니다. 또한 내 답변에 추가 할 수도 있습니다 .
— giannis christofakis

4
TRUNCATE는 ROLLBACK의 영향을받지 않으므로 트랜잭션에서 사용할 수 없습니다. 이 경우 (new MyModel)-> newQuery ()-> delete ()를 사용하면됩니다.
— hammurabi

12

간접적 인 방법이 있습니다 :

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

예:

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

라 라벨 쿼리 빌더 정보 : https://laravel.com/docs/5.4/queries


1
@aschipfl은 실제로 설명하지 않습니다. 코드 DELETE FROM users WHERE id LIKE '%%'는 테이블의 모든 행과 일치 하는 SQL 을 실행하여 모든 것을 삭제합니다.
— Hkan

이것은 나의 길에 나를 얻었다. 필자는 다른 모델에서 pluck ()을 수행하여 필요한 ID의 배열을 얻은 다음 해당 배열을 사용하여 다음 whereIn방법을 사용하여 모델에서 모든 레코드를 삭제했습니다 . $itemsAllContentIDs = Item::where('user_id', $userId)->pluck('item_content_id')->all(); ItemsContent::whereIn('id', $itemsAllContentIDs)->delete();
— Keith DC

9

Google을 통해이 스레드에 도달하는 사람들을 위해 다른 옵션을 추가하고 싶었습니다. 나는 이것을 달성해야했지만 truncate()재설정 되는 자동 증가 값을 유지하고 싶었습니다 . 또한 DB::모델 객체에서 직접 작업하기를 원했기 때문에 아무것도 사용하고 싶지 않았습니다 . 그래서 나는 이것을 가지고 갔다 :

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

분명히 열은 실제로 존재해야하지만 표준 Eloquent 모델에서는 id열이 존재하며 절대 null이 아닙니다. 이것이 최선의 선택인지는 모르겠지만 목적을 위해 작동합니다.


Model::delete();같은 것을 성취 할 것입니다.
— Leng

5
불행히도 Laravel 5.0 이상에서는 Model::delete()예외가 발생 Non-static method Illuminate\Database\Eloquent\Model::delete() should not be called statically합니다.
— Dave James Miller

6

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

이 작업을 수행하는 가장 좋은 방법은 다음과 같이 인터페이스를 Laravel 3사용 Fluent하여 테이블을 자르는 것 같습니다.

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

2

당신은 또한 소프트 삭제를 유지하는이 하나의 라이너를 시도 할 수 있습니다 :

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


0

Travis vignon의 대답과 비슷한 맥락에서 웅변 모델의 데이터가 필요했으며 조건이 맞으면 모델을 삭제하거나 업데이트해야했습니다. 하나의 원시 SQL 쿼리를 통해 필드를 업데이트하기 위해 원래 선택 기준과 함께 쿼리에서 반환 한 최소 및 최대 I 'd 필드 (선택 기준을 충족하는 테이블에 다른 필드가 추가 된 경우)를 얻었습니다. 컬렉션의 개체 당 하나의 웅변 쿼리와 반대).

원시 SQL을 사용하면 아름다운 코드 철학을 어 기고 있음을 알고 있지만 하나 대신 수백 개의 쿼리를 위장하기가 어려웠습니다.


0

할 수 있습니다 루프도 ..

$collection = Model::get();

foreach($collection as $c) {

$c->delete();

}

기술적으로 그렇습니다 ... 그러나 더 나은 단일 쿼리 옵션이 있기 때문에 IMO는 약간 필요하지 않습니다.
— Pete

@Pete 알아요 .. 다른 사람들은 이미 답변을주었습니다 ... 다른 가능한 방법을 시도했습니다 ..
— Sam Solomon

1
특정 규칙을 기반으로 컬렉션의 모델을 보관하고 해당 일일 활성 테이블에서 모델을 지우려는 경우 실제로 이것은 효과적입니다.
— James Perih

-1

외래 키 제약 조건으로 Lumen 5.5와 함께 작동하는 솔루션 :

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

}
return response()->json(['error' => false]);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.