Respuestas:
La razón MyModel::all()->delete()
no funciona porque en all()
realidad dispara la consulta y devuelve una colección de objetos Eloquent.
Puede utilizar el método truncado, esto funciona para Laravel 4 y 5:
MyModel::truncate();
Eso elimina todas las filas de la tabla sin registrar eliminaciones de filas individuales.
MyModel::all()->delete()
, usaforeach (MyModel::all() as $e) { $e->delete() }
Laravel 5.2+ solución.
Model::getQuery()->delete();
Simplemente tome el constructor subyacente con el nombre de la tabla y haga lo que sea. No podría ser más ordenado que eso.
Solución Laravel 5.6
\App\Model::query()->delete();
Puede usarlo Model::truncate()
si lo deshabilita foreign_key_checks
(supongo que usa MySQL).
DB::statement("SET foreign_key_checks=0");
Model::truncate();
DB::statement("SET foreign_key_checks=1");
He visto que ambos métodos se han usado en archivos semilla.
// Uncomment the below to wipe the table clean before populating
DB::table('table_name')->truncate();
//or
DB::table('table_name')->delete();
Aunque no puede usar el primero si desea establecer claves foráneas .
No se puede truncar una tabla a la que se hace referencia en una restricción de clave externa
Por lo tanto, podría ser una buena idea usar la segunda.
delete
obviamente no es lo mismo que truncate
si.
Hay una forma indirecta:
myModel:where('anyColumnName', 'like', '%%')->delete();
Ejemplo:
User:where('id', 'like' '%%')->delete();
Información del generador de consultas Laravel: https://laravel.com/docs/5.4/queries
DELETE FROM users WHERE id LIKE '%%'
que coincide con todas las filas de la tabla, eliminando así todo.
whereIn
método: $itemsAllContentIDs = Item::where('user_id', $userId)->pluck('item_content_id')->all();
ItemsContent::whereIn('id', $itemsAllContentIDs)->delete();
Quería agregar otra opción para aquellos que llegan a este hilo a través de Google. Necesitaba lograr esto, pero quería conservar mi valor de incremento automático que se truncate()
restablece. Tampoco quería usar DB::
nada porque quería operar directamente fuera del objeto modelo. Entonces, fui con esto:
Model::whereNotNull('id')->delete();
Obviamente, la columna tendrá que existir realmente, pero en un modelo Eloquent estándar y listo para usar, la id
columna existe y nunca es nula. No sé si esta es la mejor opción, pero funciona para mis propósitos.
Model::delete();
logrará lo mismo.
Model::delete()
arroja una excepción Non-static method Illuminate\Database\Eloquent\Model::delete() should not be called statically
, al menos en Laravel 5.0.
No pude usar, Model::truncate()
ya que sería un error:
SQLSTATE [42000]: Error de sintaxis o infracción de acceso: 1701 No se puede truncar una tabla a la que se hace referencia en una restricción de clave externa
Y desafortunadamente Model::delete()
no funciona (al menos en Laravel 5.0):
El método no estático Illuminate \ Database \ Eloquent \ Model :: delete () no debe llamarse estáticamente, suponiendo $ this desde un contexto incompatible
Pero esto funciona:
(new Model)->newQuery()->delete()
Eso eliminará suavemente todas las filas, si tiene configurada la eliminación suave. Para eliminar completamente todas las filas, incluidas las eliminadas temporalmente, puede cambiar esto:
(new Model)->newQueryWithoutScopes()->forceDelete()
Solución simple:
Mymodel::query()->delete();
En una línea similar a la respuesta de Travis vignon, requería datos del modelo elocuente, y si las condiciones eran correctas, necesitaba eliminar o actualizar el modelo. Terminé obteniendo el campo mínimo y máximo que había devuelto por mi consulta (en caso de que se agregara otro campo a la tabla que cumpliera con mis criterios de selección) junto con los criterios de selección originales para actualizar los campos a través de una consulta SQL sin procesar (como opuesto a una consulta elocuente por objeto en la colección).
Sé que el uso de SQL sin procesar viola la hermosa filosofía de código de Laravels, pero sería difícil soportar cientos de consultas en lugar de una.
Puede hacer un para cadabucle también ..
$collection = Model::get();
foreach($collection as $c) {
$c->delete();
}
Solución que trabaja con Lumen 5.5 con restricciones de claves foráneas:
$categories = MusicCategory::all();
foreach($categories as $category)
{
$category->delete();
}
return response()->json(['error' => false]);