Risposte:
La ragione per cui MyModel::all()->delete()non funziona è perché in all()realtà attiva la query e restituisce una raccolta di oggetti Eloquent.
Puoi usare il metodo troncato, questo funziona per Laravel 4 e 5:
MyModel::truncate();
Ciò elimina tutte le righe dalla tabella senza registrare le singole eliminazioni di riga.
MyModel::all()->delete(), usaforeach (MyModel::all() as $e) { $e->delete() }
Laravel 5.2+ soluzione.
Model::getQuery()->delete();
Basta prendere il costruttore sottostante con il nome della tabella e fare qualunque cosa. Non potrebbe essere più ordinato di così.
Laravel 5.6 soluzione
\App\Model::query()->delete();
Puoi Model::truncate()disabilitare se disabiliti foreign_key_checks(suppongo che tu usi MySQL).
DB::statement("SET foreign_key_checks=0");
Model::truncate();
DB::statement("SET foreign_key_checks=1");
Ho visto entrambi i metodi usati nei file seme.
// Uncomment the below to wipe the table clean before populating
DB::table('table_name')->truncate();
//or
DB::table('table_name')->delete();
Anche se non è possibile utilizzare il primo se si desidera impostare chiavi esterne .
Impossibile troncare una tabella a cui fa riferimento un vincolo di chiave esterna
Quindi potrebbe essere una buona idea usare il secondo.
deleteovviamente non è lo stesso di truncatese.
C'è un modo indiretto:
myModel:where('anyColumnName', 'like', '%%')->delete();
Esempio:
User:where('id', 'like' '%%')->delete();
Informazioni sul generatore di query Laravel: https://laravel.com/docs/5.4/queries
DELETE FROM users WHERE id LIKE '%%'che corrisponde a tutte le righe della tabella, eliminando così tutto.
whereInmetodo: $itemsAllContentIDs = Item::where('user_id', $userId)->pluck('item_content_id')->all(); ItemsContent::whereIn('id', $itemsAllContentIDs)->delete();
Volevo aggiungere un'altra opzione per chi arriva a questa discussione tramite Google. Avevo bisogno di farlo, ma volevo mantenere il mio valore di auto-incremento che si truncate()ripristina. Inoltre, non volevo usare DB::nulla perché volevo operare direttamente dall'oggetto modello. Quindi, sono andato con questo:
Model::whereNotNull('id')->delete();
Ovviamente la colonna dovrà effettivamente esistere, ma in un modello Eloquent standard pronto all'uso, la idcolonna esiste e non è mai nulla. Non so se questa sia la scelta migliore, ma funziona per i miei scopi.
Model::delete();realizzerà la stessa cosa.
Model::delete()genera un'eccezione Non-static method Illuminate\Database\Eloquent\Model::delete() should not be called statically, almeno in Laravel 5.0.
Non sono stato in grado di utilizzare Model::truncate()come sarebbe l'errore:
SQLSTATE [42000]: errore di sintassi o violazione di accesso: 1701 Impossibile troncare una tabella a cui fa riferimento un vincolo di chiave esterna
E purtroppo Model::delete()non funziona (almeno in Laravel 5.0):
Il metodo non statico Illuminate \ Database \ Eloquent \ Model :: delete () non deve essere chiamato staticamente, presupponendo $ this da un contesto incompatibile
Ma questo funziona:
(new Model)->newQuery()->delete()
Ciò eliminerà automaticamente tutte le righe, se è stata configurata l'eliminazione soft. Per eliminare completamente tutte le righe, comprese quelle a eliminazione graduale, è possibile passare a questa:
(new Model)->newQueryWithoutScopes()->forceDelete()
soluzione semplice:
Mymodel::query()->delete();
Analogamente alla risposta di Travis vignon, ho richiesto i dati dal modello eloquente e, se le condizioni erano corrette, dovevo eliminare o aggiornare il modello. Ho finito per ottenere il campo minimo e massimo restituito dalla mia query (nel caso in cui un altro campo fosse aggiunto alla tabella che soddisfacesse i miei criteri di selezione) insieme ai criteri di selezione originali per aggiornare i campi tramite una query SQL non elaborata (come al contrario di una query eloquente per oggetto nella raccolta).
So che l'uso di SQL raw viola la meravigliosa filosofia del codice Laravels, ma sarebbe difficile rispondere a centinaia di query al posto di una.
Può fare un per ciascunoloop troppo ..
$collection = Model::get();
foreach($collection as $c) {
$c->delete();
}
Soluzione che funziona con Lumen 5.5 con vincoli di chiavi esterne:
$categories = MusicCategory::all();
foreach($categories as $category)
{
$category->delete();
}
return response()->json(['error' => false]);