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



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



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


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

711   12  

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

    Ничего не найдено.