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

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

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

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



답변

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

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

MyModel::truncate();

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


답변

라 라벨 5.2+ 솔루션.

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

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

라 라벨 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();

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

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

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


답변

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

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

예:

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

라 라벨 쿼리 빌더 정보 : 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()