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)이 아닙니다. 이것이 최선의 선택인지는 모르겠지만 목적을 위해 작동합니다.
이 작업을 수행하는 가장 좋은 방법은 다음과 같이 인터페이스를 Laravel 3
사용 Fluent
하여 테이블을 자르는 것 같습니다.
DB::query("TRUNCATE TABLE mytable");
Model::truncate()
오류가 발생 하여 사용할 수 없었습니다 .
SQLSTATE [42000] : 구문 오류 또는 액세스 위반 : 1701 외래 키 제약 조건에서 참조되는 테이블을자를 수 없습니다
불행히도 Model::delete()
작동하지 않습니다 (적어도 Laravel 5.0에서는).
비 정적 메소드 Illuminate \ Database \ Eloquent \ Model :: delete ()는 $ this가 호환되지 않는 컨텍스트에서 가정 할 때 정적으로 호출되지 않아야합니다.
그러나 이것은 효과가 있습니다.
(new Model)->newQuery()->delete()
일시 삭제가 설정된 경우 모든 행을 일시 삭제합니다. 일시 삭제 된 행을 포함하여 모든 행을 완전히 삭제하려면 다음과 같이 변경할 수 있습니다.
(new Model)->newQueryWithoutScopes()->forceDelete()
당신은 또한 소프트 삭제를 유지하는이 하나의 라이너를 시도 할 수 있습니다 :
Model::whereRaw('1=1')->delete();
Travis vignon의 대답과 비슷한 맥락에서 웅변 모델의 데이터가 필요했으며 조건이 맞으면 모델을 삭제하거나 업데이트해야했습니다. 하나의 원시 SQL 쿼리를 통해 필드를 업데이트하기 위해 원래 선택 기준과 함께 쿼리에서 반환 한 최소 및 최대 I 'd 필드 (선택 기준을 충족하는 테이블에 다른 필드가 추가 된 경우)를 얻었습니다. 컬렉션의 개체 당 하나의 웅변 쿼리와 반대).
원시 SQL을 사용하면 아름다운 코드 철학을 어 기고 있음을 알고 있지만 하나 대신 수백 개의 쿼리를 위장하기가 어려웠습니다.
Can do a foreachloop too..
$collection = Model::get();
foreach($collection as $c) {
$c->delete();
}
Solution who works with Lumen 5.5 with foreign keys constraints :
$categories = MusicCategory::all();
foreach($categories as $category)
{
$category->delete();
}
return response()->json(['error' => false]);
simple solution:
Mymodel::query()->delete();
참고URL : https://stackoverflow.com/questions/15484404/how-to-delete-all-the-rows-in-a-table-using-eloquent
'developer tip' 카테고리의 다른 글
Windows 용 Docker가 드라이브를 공유 할 수 있도록 Windows 방화벽 설정 (0) | 2020.08.02 |
---|---|
Python AttributeError : 'module'객체에 'Serial'속성이 없습니다. (0) | 2020.08.02 |
jQuery UI 탭-현재 선택된 탭 인덱스를 얻는 방법 (0) | 2020.08.02 |
영숫자 문자 만 허용하도록 문자열의 유효성을 검사하려면 어떻게해야합니까? (0) | 2020.08.02 |
프로그래밍 방식으로 CardView의 배경색 변경 (0) | 2020.08.02 |