Я предполагал использовать следующий синтаксис:
MyModel::all()->delete();
Но это не сработало. Я уверен, что это очень просто, но я искал документацию по этой теме и не могу ее найти!
Я предполагал использовать следующий синтаксис:
MyModel::all()->delete();
Но это не сработало. Я уверен, что это очень просто, но я искал документацию по этой теме и не могу ее найти!
Причина MyModel::all()->delete()
не работает, потому что all()
действительно запускает запрос и возвращает коллекцию объектов Eloquent.
Вы можете использовать метод truncate, это работает для Laravel 4 и 5:
MyModel::truncate();
Отбрасывает все строки из таблицы без регистрации отдельных удалений строк.
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();
Даже если вы не можете использовать первый, если вы хотите установить внешние ключи.
Не удается обрезать таблицу, на которую ссылается ограничение внешнего ключа
Так что неплохо было бы использовать второй.
Существует косвенный способ:
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();
Очевидно, что столбец должен существовать на самом деле, но в стандартной, готовой модели Eloquent столбец id
существует и никогда не является нулевым. Я не знаю, является ли это лучшим выбором, но он работает для моих целей.
Наилучшим способом выполнения этой операции в 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()
Это будет мягко удалять все строки, если у вас установлено soft-delete. Чтобы полностью удалить все строки, включая мягко удаленные, вы можете изменить это:
(new Model)->newQueryWithoutScopes()->forceDelete()
Вы можете попробовать этот однострочник, который также сохраняет soft-delete:
Model::whereRaw('1=1')->delete();
В том же ключе, что и ответ Трэвиса Виньона, мне нужны данные из красноречивой модели, и если условия были правильными, мне нужно было либо удалить, либо обновить модель. Я закончил получать минимальное и максимальное поле, которое я вернул бы по моему запросу (в случае, если к таблице было добавлено другое поле, которое соответствовало бы моим критериям выбора) вместе с исходными критериями выбора для обновления полей через один необработанный SQL-запрос (как против одного красноречивого запроса на объект в коллекции).
Я знаю, что использование необработанного SQL нарушает красивую философию кода laravels, но при этом может быть сложно вносить в него сотни запросов.
Можно сделать foreach loop..
$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]);
Вы также можете использовать силу Eloquent, делая это;
MyModel::get()->each->delete();
простое решение:
Mymodel::query()->delete();