Depois que você carregou uma entidade, você pode excluir ela chamando o o método delete da tabela de origem:
// Num a controller.
$entity = $this->Articles->get(2);
$result = $this->Articles->delete($entity);
Ao excluir entidades algumas coisas acontecem:
As delete rules serão aplicadas. Se as regras falharem, a exclusão será impedida.
O evento Model.beforeDelete
é disparado. Se esse evento for interrompido, a
exclusão será cancelada e o resultado do evento será retornado.
A entidade será excluída.
Todas as associações dependentes serão excluídas. Se as associações estão sendo excluídas como entidades, eventos adicionais serão disparados.
Qualquer registro da tabela de ligação para associação BelongsToMany serão removidos.
O evento Model.afterDelete
será disparado.
Por padrão, todas as exclusões acontecem dentro de uma transação. Você pode desativar a transação com a opção atomic:
$result = $this->Articles->delete($entity, ['atomic' => false]);
Ao excluir entidades, os dados associados também podem ser excluídos. Se suas
associações HasOne e HasMany estão configurados como dependent
, as operações
de exclusão serão “cascate” para essas entidades também. Por padrão entidades
em tabelas associadas são removidas usando Cake\ORM\Table::deleteAll()
.
Você pode optar que o ORM carregue as entidades relacionadas, para então
excluir individualmente, definindo a opção cascadeCallbacks
como true
:
// No método initialize de alguma modelo Table
$this->hasMany('Comments', [
'dependent' => true,
'cascadeCallbacks' => true,
]);
Nota
Configurando cascadeCallbacks
para true
, resulta em exclusões
consideravelmente mais lentos quando comparado com exclusão em masa. A
opção cascadeCallbacks apenas deve ser ativada quando sua aplicação
tem trabalho importante manipulado por event listeners.
Pode ter momentos em que excluir linhas individualmente não é eficiente ou útil. Nesses casos, é mais eficiente usar uma exclusão em massa para remover várias linhas de uma vez só:
// Exclui todos oss spam
function destroySpam()
{
return $this->deleteAll(['is_spam' => true]);
}
Uma exclusão em massa será considerada bem-sucedida se uma ou mais linhas forem excluídas.
Aviso
deleteAll não dispara os eventos beforeDelete/afterDelete. Se você precisa deles, você precisa, primeiro carregar uma coleção de registros e então excluí-las.
Usar esse método lançará uma
Cake\ORM\Exception\PersistenceFailedException
se:
a entidade é nova
a entidade não tem valor de chave primária
as verificações das regras da aplicação falharam
a exclusão foi interrompida por um callback.
Se você deseja rastrear a entidade que falhou ao salvar, você pode usar o método
Cake\ORMException\PersistenceFailedException::getEntity()
:
try {
$table->deleteOrFail($entity);
} catch (\Cake\ORM\Exception\PersistenceFailedException $e) {
echo $e->getEntity();
}
Como isso executa internamente uma chamada ao Cake\ORM\Table::delete()
, todos eventos de exclusão
correspondentes serão disparados.