Quando eu excluo uma linha usando esta sintaxe:
$user->delete();
Existe uma maneira de anexar um tipo de retorno de chamada, para que, por exemplo, faça isso automaticamente:
$this->photo()->delete();
De preferência dentro da classe de modelo.
first()
na consulta para que eu pudesse acessar o modelo de evento egUser::where('id', '=', $id)->first()->delete();
Fonteforeach($user->photos as $photo)
,$photo->delete()
para garantir que cada criança tivesse seus filhos removidos em todos os níveis, em vez de apenas um, como estava acontecendo por algum motivo.Photos
hastags
e você faz o mesmo noPhotos
modelo (isto é, nodeleting
método$photo->tags()->delete();
:), ele nunca é acionado. Mas se eu fizer umfor
loop e fazer algo parecidofor($user->photos as $photo) { $photo->delete(); }
, otags
também será excluído! apenas FYIVocê pode configurá-lo nas suas migrações:
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
Fonte: http://laravel.com/docs/5.1/migrations#foreign-key-constraints
fonte
Você pode excluir todas as fotos relacionadas antes de excluir o usuário.
Espero que ajude.
fonte
$this->photos()->delete()
. Ophotos()
retorna o objeto construtor de consulta.Relação no modelo de usuário:
Excluir registro e relacionados:
fonte
Existem 3 abordagens para resolver isso:
1. Usando eventos eloquentes na inicialização do modelo (ref: https://laravel.com/docs/5.7/eloquent#events )
2. Usando observadores de eventos eloquentes (ref: https://laravel.com/docs/5.7/eloquent#observers )
No seu AppServiceProvider, registre o observador da seguinte maneira:
Em seguida, adicione uma classe Observer da seguinte forma:
3. Usando restrições de chave estrangeira (ref: https://laravel.com/docs/5.7/migrations#foreign-key-constraints )
fonte
A partir do Laravel 5.2, a documentação afirma que esses tipos de manipuladores de eventos devem ser registrados no AppServiceProvider:
Suponho até movê-los para classes separadas, em vez de encerramentos, para uma melhor estrutura de aplicativos.
fonte
Eloquent::observe()
método também está disponível no 5.2 e pode ser usado no AppServiceProvider.photos()
, você também precisa ter cuidado - este processo não netos de exclusão, porque você está não carregar modelos. Você precisará fazer um loopphotos
(note, nãophotos()
) e acionar odelete()
método neles como modelos para acionar os eventos relacionados à exclusão.É melhor se você substituir o
delete
método para isso. Dessa forma, você pode incorporar transações de banco de dados nodelete
próprio método. Se você usar o caminho do evento, terá que cobrir sua chamada dedelete
método com uma transação de banco de dados toda vez que a chamar.No seu
User
modelo.fonte
No meu caso, foi bem simples, porque minhas tabelas de banco de dados são InnoDB com chaves estrangeiras com Cascade on Delete.
Portanto, nesse caso, se sua tabela de fotos contiver uma referência de chave estrangeira para o usuário, tudo o que você precisará fazer é excluir o hotel e a limpeza será feita pelo Banco de Dados, o banco de dados excluirá todos os registros de fotos dos dados base.
fonte
Iria percorrer a coleção desanexando tudo antes de excluir o próprio objeto.
aqui está um exemplo:
Eu sei que não é automático, mas é muito simples.
Outra abordagem simples seria fornecer ao modelo um método. Como isso:
Em seguida, você pode simplesmente chamar isso onde precisar:
fonte
Ou você pode fazer isso se quiser, apenas outra opção:
Observe que se você não estiver usando a conexão laravel db padrão, precisará fazer o seguinte:
fonte
Para elaborar a resposta selecionada, se seus relacionamentos também tiverem relacionamentos filhos que devem ser excluídos, você deverá recuperar todos os registros de relacionamentos filhos primeiro e depois chamar o
delete()
método para que seus eventos de exclusão também sejam acionados corretamente.Você pode fazer isso facilmente com mensagens de ordem superior .
Você também pode melhorar o desempenho consultando apenas a coluna ID do relacionamento:
fonte
Sim, mas como o @supersan afirmou acima em um comentário, se você excluir () em um QueryBuilder, o evento do modelo não será acionado, porque não estamos carregando o modelo em si, e chamamos delete () nesse modelo.
Os eventos são disparados apenas se usarmos a função de exclusão em uma Instância do Modelo.
Então, este ser disse:
para excluir as tags de postagem ao excluir o usuário, teríamos que repetir
$user->posts
e chamar$post->delete()
foreach($user->posts as $post) { $post->delete(); }
-> isso acionará o evento de exclusão no PostVS
$user->posts()->delete()
-> isso não dispara o evento de exclusão na publicação porque, na verdade, não carregamos o Post Model (apenas executamos um SQL como:DELETE * from posts where user_id = $user->id
e, portanto, o modelo Post nem sequer é carregado)fonte
Você pode usar esse método como uma alternativa.
O que acontecerá é que pegamos todas as tabelas associadas à tabela de usuários e excluímos os dados relacionados usando loop
fonte