robsonvleite / datalayer

The data layer is a persistent abstraction component of your database that PDO (O data layer é um componente para abstração de persistência no seu banco de dados que usa PDO com prepared statements)
https://www.upinside.com.br
MIT License
144 stars 53 forks source link

Método Destroy Não funciona #23

Closed raoniorodrigues closed 3 years ago

raoniorodrigues commented 4 years ago

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();`

image

Podem me ajudar?

raoniorodrigues commented 4 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:

image

Table Address:

image

Table users:

image

giovannialo commented 4 years ago

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).

euThiagoOliveira commented 4 years ago

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

vttsouza commented 3 years ago

@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.

Criando o banco

01 - Create Database

CREATE DATABASE IF NOT EXISTSexclusion_testDEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

Aqui é a criação simples de um banco de teste usando UTF8.

   

Criando a tabela Addresses

02 - Create Table - Addresses

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).

   

Criando a tabela Users

03 - Create Table - Users

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).

   

Criando o relacionamento entre o User e o Address

04 - Create Foreign Key

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:

05 - Relation Tables

Populando a tabela Addresses

06 - Table Addresses

Criei dois endereços (id=1 e id=2).    

Populando a tabela Users

07 - Table Users

Criei três usuários, sendo que a Maria e o Marcos moram no mesmo endereço (address_id=2).    

Excluindo um endereço

08 - Destroy Address (id=2)

Agora vou apagar diretamente no banco (tabela addresses), o endereço de id=2.    

Consultando a tabela Users

09 - Result Reflected Users Table

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.

Considerações

Vale ressaltar que essa opção deve ser usada com cautela, pois, deve se adequar a sua regra de negócio.

Espero ter ajudado!