Відповіді:
Причина MyModel::all()->delete()
не працює в тому, що all()
фактично вимикає запит і повертає колекцію красномовних об'єктів.
Можна скористатися методом усікання, це працює для 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();
Очевидно, що стовпець повинен буде насправді існувати, але в стандартній нестандартній красномовній моделі id
стовпець існує і ніколи не буває нульовим. Я не знаю, чи це найкращий вибір, але це працює в моїх цілях.
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 \ База даних \ Красномовний \ Модель :: delete () не повинен називатися статично, вважаючи $ це з несумісного контексту
Але це працює:
(new Model)->newQuery()->delete()
Це дозволить видалити всі рядки, якщо у вас налаштовано програмне видалення. Щоб повністю видалити всі рядки, включаючи м'яко видалені, ви можете змінити це:
(new Model)->newQueryWithoutScopes()->forceDelete()
просте рішення:
Mymodel::query()->delete();
Як і у відповіді Тревіса Віньйона, я вимагав даних з красномовної моделі, і якщо умови були правильні, мені потрібно було видалити або оновити модель. Я завершив отримання мінімального і максимального поля, поверненого моїм запитом (у випадку, якщо до таблиці було додано інше поле, яке відповідало б моїм критеріям відбору), а також оригінальні критерії відбору для оновлення полів за допомогою одного необробленого запиту SQL (як на відміну від одного красномовного запиту на об’єкт у колекції).
Я знаю, що використання сирого SQL порушує філософію прекрасної філософії коду, але і т. Д. Важко буде переповнити сотні запитів замість одного.
Можна зробити для кожногопетля теж ..
$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]);