Ответы:
Причина MyModel::all()->delete()
неработоспособности заключается в том, что на all()
самом деле запрос запускается и возвращает коллекцию объектов Eloquent.
Вы можете использовать метод truncate, это работает для Laravel 4 и 5:
MyModel::truncate();
Это удаляет все строки из таблицы без регистрации удаления отдельных строк.
MyModel::all()->delete()
, используйтеforeach (MyModel::all() as $e) { $e->delete() }
Решение Laravel 5.2+ .
Model::getQuery()->delete();
Просто возьмите базовый конструктор с именем таблицы и сделайте что угодно. Не может быть лучше этого.
Решение Laravel 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();
Информация о построителе запросов Laravel: https://laravel.com/docs/5.4/queries
DELETE FROM users WHERE id LIKE '%%'
который соответствует всем строкам в таблице, тем самым удаляя все.
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
, по крайней мере, в Laravel 5.0.
Я не смог использовать, так Model::truncate()
как это вызвало бы ошибку:
SQLSTATE [42000]: синтаксическая ошибка или нарушение прав доступа: 1701 Невозможно усечь таблицу, на которую имеется ссылка в ограничении внешнего ключа
И, к сожалению Model::delete()
, не работает (по крайней мере, в Laravel 5.0):
Нестатический метод Illuminate \ Database \ Eloquent \ Model :: delete () не должен вызываться статически, если $ this из несовместимого контекста
Но это действительно работает:
(new Model)->newQuery()->delete()
Это приведет к мягкому удалению всех строк, если у вас настроено мягкое удаление. Чтобы полностью удалить все строки, включая частично удаленные, вы можете изменить это:
(new Model)->newQueryWithoutScopes()->forceDelete()
простое решение:
Mymodel::query()->delete();
Подобно ответу Трэвиса Виньона, мне потребовались данные из красноречивой модели, и если условия были правильными, мне нужно было либо удалить, либо обновить модель. Я получил минимальное и максимальное значение поля, возвращаемое моим запросом (в случае, если в таблицу было добавлено другое поле, которое соответствовало бы моим критериям выбора) вместе с исходными критериями выбора для обновления полей с помощью одного необработанного SQL-запроса (как в отличие от одного красноречивого запроса на объект в коллекции).
Я знаю, что использование необработанного SQL нарушает философию прекрасного кода Laravel, но было бы трудно переварить, возможно, сотни запросов вместо одного.
Может сделать для каждогопетля тоже ..
$collection = Model::get();
foreach($collection as $c) {
$c->delete();
}
Решение, которое работает с Lumen 5.5 с ограничениями внешних ключей:
$categories = MusicCategory::all();
foreach($categories as $category)
{
$category->delete();
}
return response()->json(['error' => false]);