답변:
MyModel::all()->delete()
작동하지 않는 이유 는 all()
실제로 쿼리를 시작하고 Eloquent 객체 컬렉션을 반환 하기 때문 입니다.
잘라 내기 방법을 사용할 수 있습니다. Laravel 4 및 5에서 작동합니다.
MyModel::truncate();
개별 행 삭제를 기록하지 않고 테이블에서 모든 행을 삭제합니다.
MyModel::all()->delete()
, 사용foreach (MyModel::all() as $e) { $e->delete() }
라 라벨 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();
외래 키 를 설정하려면 첫 번째 키 를 사용할 수 없습니다 .
외래 키 제약 조건에서 참조되는 테이블을자를 수 없습니다
따라서 두 번째 것을 사용하는 것이 좋습니다.
delete
분명히 같지는 않습니다 truncate
.
간접적 인 방법이 있습니다 :
myModel:where('anyColumnName', 'like', '%%')->delete();
예:
User:where('id', 'like' '%%')->delete();
라 라벨 쿼리 빌더 정보 : https://laravel.com/docs/5.4/queries
DELETE FROM users WHERE id LIKE '%%'
는 테이블의 모든 행과 일치 하는 SQL 을 실행하여 모든 것을 삭제합니다.
whereIn
방법을 사용하여 모델에서 모든 레코드를 삭제했습니다 . $itemsAllContentIDs = Item::where('user_id', $userId)->pluck('item_content_id')->all();
ItemsContent::whereIn('id', $itemsAllContentIDs)->delete();
Google을 통해이 스레드에 도달하는 사람들을 위해 다른 옵션을 추가하고 싶었습니다. 나는 이것을 달성해야했지만 truncate()
재설정 되는 자동 증가 값을 유지하고 싶었습니다 . 또한 DB::
모델 객체에서 직접 작업하기를 원했기 때문에 아무것도 사용하고 싶지 않았습니다 . 그래서 나는 이것을 가지고 갔다 :
Model::whereNotNull('id')->delete();
분명히 열은 실제로 존재해야하지만 표준 Eloquent 모델에서는 id
열이 존재하며 절대 null이 아닙니다. 이것이 최선의 선택인지는 모르겠지만 목적을 위해 작동합니다.
Model::delete();
같은 것을 성취 할 것입니다.
Model::delete()
예외가 발생 Non-static method Illuminate\Database\Eloquent\Model::delete() should not be called statically
합니다.
Model::truncate()
오류가 발생 하여 사용할 수 없었습니다 .
SQLSTATE [42000] : 구문 오류 또는 액세스 위반 : 1701 외래 키 제약 조건에서 참조되는 테이블을자를 수 없습니다
불행히도 Model::delete()
작동하지 않습니다 (적어도 Laravel 5.0에서는).
비 정적 메소드 Illuminate \ Database \ Eloquent \ Model :: delete ()는 $ this가 호환되지 않는 컨텍스트에서 가정 할 때 정적으로 호출되지 않아야합니다.
그러나 이것은 효과가 있습니다.
(new Model)->newQuery()->delete()
일시 삭제가 설정된 경우 모든 행을 일시 삭제합니다. 일시 삭제 된 행을 포함하여 모든 행을 완전히 삭제하려면 다음과 같이 변경할 수 있습니다.
(new Model)->newQueryWithoutScopes()->forceDelete()
할 수 있습니다 각각루프도 ..
$collection = Model::get();
foreach($collection as $c) {
$c->delete();
}