Respostas:
O motivo MyModel::all()->delete()
não funciona é porque, all()
na verdade, dispara a consulta e retorna uma coleção de objetos Eloquent.
Você pode fazer uso do método truncado, isso funciona para o Laravel 4 e 5:
MyModel::truncate();
Isso elimina todas as linhas da tabela sem registrar exclusões de linhas individuais.
MyModel::all()->delete()
, useforeach (MyModel::all() as $e) { $e->delete() }
Solução Laravel 5.2+ .
Model::getQuery()->delete();
Basta pegar o construtor subjacente com o nome da tabela e fazer o que for. Não poderia ser mais arrumado do que isso.
Solução Laravel 5.6
\App\Model::query()->delete();
Você pode usar Model::truncate()
se desabilitar foreign_key_checks
(presumo que você use o MySQL).
DB::statement("SET foreign_key_checks=0");
Model::truncate();
DB::statement("SET foreign_key_checks=1");
Eu vi os dois métodos sendo usados em arquivos de sementes.
// Uncomment the below to wipe the table clean before populating
DB::table('table_name')->truncate();
//or
DB::table('table_name')->delete();
Mesmo que você não possa usar o primeiro, se desejar definir chaves estrangeiras .
Não é possível truncar uma tabela referenciada em uma restrição de chave estrangeira
Portanto, pode ser uma boa ideia usar o segundo.
delete
obviamente não é o mesmo que truncate
se.
Existe uma maneira indireta:
myModel:where('anyColumnName', 'like', '%%')->delete();
Exemplo:
User:where('id', 'like' '%%')->delete();
Informações sobre o construtor de consultas do Laravel: https://laravel.com/docs/5.4/queries
DELETE FROM users WHERE id LIKE '%%'
que corresponde a todas as linhas da tabela, excluindo tudo.
whereIn
método: $itemsAllContentIDs = Item::where('user_id', $userId)->pluck('item_content_id')->all();
ItemsContent::whereIn('id', $itemsAllContentIDs)->delete();
Eu queria adicionar outra opção para aqueles que acessam esse tópico via Google. Eu precisava fazer isso, mas queria manter meu valor de incremento automático que é truncate()
redefinido. Eu também não queria usar DB::
nada porque queria operar diretamente fora do objeto de modelo. Então, eu fui com isso:
Model::whereNotNull('id')->delete();
Obviamente, a coluna terá que realmente existir, mas em um modelo Eloquent padrão e pronto para uso, a id
coluna existe e nunca é nula. Não sei se essa é a melhor escolha, mas funciona para meus propósitos.
Model::delete();
realizará a mesma coisa.
Model::delete()
lança uma exceção Non-static method Illuminate\Database\Eloquent\Model::delete() should not be called statically
, pelo menos no Laravel 5.0.
Não fui capaz de usar Model::truncate()
, pois seria um erro:
SQLSTATE [42000]: Erro de sintaxe ou violação de acesso: 1701 Não é possível truncar uma tabela referenciada em uma restrição de chave estrangeira
E infelizmente Model::delete()
não funciona (pelo menos no Laravel 5.0):
O método não estático Illuminate \ Database \ Eloquent \ Model :: delete () não deve ser chamado estaticamente, assumindo $ this de um contexto incompatível
Mas isso funciona:
(new Model)->newQuery()->delete()
Isso excluirá todas as linhas automaticamente, se você tiver configurado a exclusão suave. Para excluir totalmente todas as linhas, incluindo as excluídas por software, você pode alterar para isso:
(new Model)->newQueryWithoutScopes()->forceDelete()
solução simples:
Mymodel::query()->delete();
De maneira semelhante à resposta de Travis vignon, eu exigi dados do modelo eloquente e, se as condições estivessem corretas, eu precisava excluir ou atualizar o modelo. Acabei obtendo o campo mínimo e máximo retornado pela minha consulta (caso outro campo fosse adicionado à tabela que atendesse aos meus critérios de seleção) junto com o critério de seleção original para atualizar os campos por meio de uma consulta SQL bruta (como oposta a uma consulta eloquente por objeto na coleção).
Eu sei que o uso de SQL bruto viola a filosofia de código de laravels, mas seria difícil suportar possivelmente centenas de consultas no lugar de uma.
Pode fazer um para cadalaço também ..
$collection = Model::get();
foreach($collection as $c) {
$c->delete();
}
Solução que trabalha com o Lumen 5.5 com restrições de chaves estrangeiras:
$categories = MusicCategory::all();
foreach($categories as $category)
{
$category->delete();
}
return response()->json(['error' => false]);