12 ответов:
причина
MyModel::all()->delete()не работает, потому чтоall()фактически запускает запрос и возвращает коллекцию красноречивых объектов.вы можете использовать метод усечения, это работает для Laravel 4 и 5:
MyModel::truncate();который удаляет все строки из таблицы без регистрации отдельных удалений строк.
можно использовать
Model::truncate()если отключитьforeign_key_checks(Я предполагаю, что вы используете MySQL).DB::statement("SET foreign_key_checks=0"); Model::truncate(); DB::statement("SET foreign_key_checks=1");
Laravel 5.2+ решение.
Model::getQuery()->delete();просто захватить базовый строитель с именем таблицы и делать все, что угодно. Не может быть не опрятнее, чем.
Laravel 5.6 решение
\App\Model::query()->delete();
Я видел, что оба метода использовались в семенных файлах.
// 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();информация о построителе запросов Laravel:https://laravel.com/docs/5.4/queries
Я хотел добавить еще один вариант для тех, кто решил на эту тему через Google. Мне нужно было это сделать, но я хотел сохранить свое значение автоинкремента, которое
truncate()сброс. Я также не хотел использоватьDB::все, потому что я хотел работать непосредственно от объекта модели. Итак, я пошел с этим:Model::whereNotNull('id')->delete();очевидно, что столбец должен действительно существовать, но в стандартной, готовой красноречивой модели
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()
можно сделать foreachпетли тоже..
$collection = Model::get(); foreach($collection as $c) { $c->delete(); }
в том же духе, что и ответ Трэвиса Виньона, мне требовались данные из модели eloquent, и если условия были правильными, мне нужно было либо удалить, либо обновить модель. Я получил минимальное и максимальное поле, возвращенное моим запросом (в случае, если другое поле было добавлено в таблицу, которая соответствовала бы моим критериям выбора) вместе с исходными критериями выбора для обновления полей с помощью одного необработанного SQL-запроса (в отличие от одного красноречивого запроса на объект в таблице). коллекция.)
Я знаю, что использование raw SQL нарушает философию красивого кода laravels, но это будет трудно переварить, возможно, сотни запросов вместо одного.
решение, которое работает с Lumen 5.5 с ограничениями внешних ключей:
$categories = MusicCategory::all(); foreach($categories as $category) { $category->delete(); } return response()->json(['error' => false]);
вы можете попробовать этот однострочный, который также сохраняет мягкие удаления:
Model::whereRaw('1=1')->delete();
Comments