Подтвердить что ты не робот

Как удалить все строки в таблице с помощью Eloquent?

Я предполагал использовать следующий синтаксис:

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

Но это не сработало. Я уверен, что это очень просто, но я искал документацию по этой теме и не могу ее найти!

4b9b3361

Ответ 1

Причина MyModel::all()->delete() не работает, потому что all() действительно запускает запрос и возвращает коллекцию объектов Eloquent.

Вы можете использовать метод truncate, это работает для Laravel 4 и 5:

MyModel::truncate();

Отбрасывает все строки из таблицы без регистрации отдельных удалений строк.

Ответ 2

Laravel 5. 2+ решение.

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

Просто возьмите строителя с именем таблицы и делайте что угодно. Не может быть более аккуратным, чем это.

Решение Laravel 5.6

\App\Model::query()->delete();

Ответ 3

Вы можете использовать Model::truncate(), если отключить foreign_key_checks (я предполагаю, что вы используете MySQL).

DB::statement("SET foreign_key_checks=0");
Model::truncate();
DB::statement("SET foreign_key_checks=1");

Ответ 4

Я видел, как оба метода использовались в файлах семян.

// Uncomment the below to wipe the table clean before populating

DB::table('table_name')->truncate();

//or

DB::table('table_name')->delete();

Даже если вы не можете использовать первый, если вы хотите установить внешние ключи.

Не удается обрезать таблицу, на которую ссылается ограничение внешнего ключа

Так что неплохо было бы использовать второй.

Ответ 5

Существует косвенный способ:

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

Пример:

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

Информация о построении запроса Laravel: https://laravel.com/docs/5.4/queries

Ответ 6

Я хотел добавить еще один вариант для тех, кто попадает в этот поток через Google. Мне нужно было выполнить это, но мне хотелось сохранить значение автоинкремента, которое truncate() сбрасывается. Я также не хотел использовать DB:: что-либо, потому что я хотел напрямую работать с объектом модели. Итак, я пошел с этим:

Model::whereNotNull('id')->delete();

Очевидно, что столбец должен существовать на самом деле, но в стандартной, готовой модели Eloquent столбец id существует и никогда не является нулевым. Я не знаю, является ли это лучшим выбором, но он работает для моих целей.

Ответ 7

Наилучшим способом выполнения этой операции в Laravel 3, по-видимому, является использование интерфейса Fluent для обрезания таблицы, как показано ниже.

DB::query("TRUNCATE TABLE mytable");

Ответ 8

Мне не удалось использовать Model::truncate(), поскольку это могло бы быть ошибкой:

SQLSTATE [42000]: Синтаксическая ошибка или нарушение доступа: 1701 Не удается обрезать таблицу, на которую ссылается ограничение внешнего ключа

И, к сожалению, Model::delete() не работает (по крайней мере, в Laravel 5.0):

Нестатический метод Illuminate\Database\Eloquent\Model:: delete() не следует вызывать статически, предполагая $this из несовместимого контекста

Но это работает:

(new Model)->newQuery()->delete()

Это будет мягко удалять все строки, если у вас установлено soft-delete. Чтобы полностью удалить все строки, включая мягко удаленные, вы можете изменить это:

(new Model)->newQueryWithoutScopes()->forceDelete()

Ответ 9

Вы можете попробовать этот однострочник, который также сохраняет soft-delete:

Model::whereRaw('1=1')->delete();

Ответ 10

В том же ключе, что и ответ Трэвиса Виньона, мне нужны данные из красноречивой модели, и если условия были правильными, мне нужно было либо удалить, либо обновить модель. Я закончил получать минимальное и максимальное поле, которое я вернул бы по моему запросу (в случае, если к таблице было добавлено другое поле, которое соответствовало бы моим критериям выбора) вместе с исходными критериями выбора для обновления полей через один необработанный SQL-запрос (как против одного красноречивого запроса на объект в коллекции).

Я знаю, что использование необработанного SQL нарушает красивую философию кода laravels, но при этом может быть сложно вносить в него сотни запросов.

Ответ 11

Можно сделать foreach loop..

$collection = Model::get();

foreach($collection as $c) {

$c->delete();

}

Ответ 12

Решение, которое работает с Lumen 5.5 с ограничениями внешних ключей:

$categories = MusicCategory::all();
foreach($categories as $category)
{
$category->delete();

}
return response()->json(['error' => false]);

Ответ 13

Вы также можете использовать силу Eloquent, делая это;

MyModel::get()->each->delete();

Ответ 14

простое решение:

 Mymodel::query()->delete();