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.