developer tip

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

optionbox 2020. 8. 2. 18:23
반응형

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 loop 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

반응형