Closed raoniorodrigues closed 3 years ago
Percebi que somente nomes que estão atrelados aos seus endereços pela FK, não podem serem excluídos. Como posso realizar a exclusão de maneira que reflita no banco de dados?
Schemas:
Table Address:
Table users:
Normalmente não é possível remover algum registro quando ele está atrelado a outro. Para isso, você precisa implementar a regra no seu banco de dados que, quando um usuário for deletado, o endereço deve ser deletado junto (efeito cascata).
defina trigger para disparar após um registro for excluído, exemplo: destrói o id de maria através da id correto? Então você usa a trigger no banco de dados para fazer o feito em cascata, e todos os registros que tiverem uma chave estrangeira de Maria também será excluído, essa função tá no banco de dados mesmo on cascade delete e update para atualizar @giovannialo & @raoniokabayashirodrigues
@raoniokabayashirodrigues bom dia.
Algo que você pode fazer é definir a regra de exclusão diretamente no banco, para manter a integridade do mesmo. Vou te mostrar um passo a passo, que talvez possa ajudar.
CREATE DATABASE IF NOT EXISTS
exclusion_testDEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
Aqui é a criação simples de um banco de teste usando UTF8.
CREATE TABLE 'addresses' ( 'id' int(10) UNSIGNED NOT NULL, 'street' varchar(255) NOT NULL, 'number' varchar(30) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Aqui tudo normal também, apenas criei uma chave primária (id), um campo de rua (street) e um número (number).
CREATE TABLE 'users' ( 'id' int(10) UNSIGNED NOT NULL, 'address_id' int(10) UNSIGNED NOT NULL, 'name' varchar(255) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Agora temos uma tabela simples também, com uma chave primária (id), uma chave estrangeira que no próximo passo vai referenciar o endereço (address_id) e um nome (name).
ALTER TABLE 'users' ADD CONSTRAINT 'fk_address_id' FOREIGN KEY ('address_id') REFERENCES 'addresses' ('id') ON DELETE CASCADE ON UPDATE NO ACTION;
Agora na tabela Users adicionamos uma chave estrangeira (foreign key) com o nome de fk_address_id, que receberá o id da tabela addresses.
A atenção aqui está na opção 'ON DELETE', que selecionei a opção 'CASCADE', ou seja, quando um endereço for excluído, o usuário ao qual esse endereço pertence, será excluído também, independente de estar sendo tratado ou não na aplicação.
A relação entre as tabelas ficou da seguinte forma:
Criei dois endereços (id=1 e id=2).
Criei três usuários, sendo que a Maria e o Marcos moram no mesmo endereço (address_id=2).
Agora vou apagar diretamente no banco (tabela addresses), o endereço de id=2.
Podemos perceber agora, quando visualizamos o conteúdo da tabela users, que só existe o João.
Como o Marcos e a Maria possuíam o endereço id=2, e esse endereço foi apagado e a tabela possui o parâmetro ON DELETE CASCADE
, isso faz com que automaticamente o banco se encarregue de eliminar esses usuários.
Vale ressaltar que essa opção deve ser usada com cautela, pois, deve se adequar a sua regra de negócio.
Espero ter ajudado!
Boa tarde!
Ao realizar o PHP Tips com tema - ABSTRAÇÃO DE BANCO DE DADOS COM DATA LAYER | PHP TIPS #002, tentei executar o método destroy(). Porém ele não funciona.
`<?php
require DIR . "/../vendor/autoload.php";
use Source\Models\User;
$user = (new User())->findById(5);
$user->destroy();`
Podem me ajudar?