Relacionamentos de dados parentais em PHP
Suponha que tenhamos a tarefa de armazenar pais e filhos. Suponha que cada pai possa ter apenas um filho, e o filho, por sua vez, também pode ter um filho.
Precisamos pensar em como armazenaremos os dados.
A primeira ideia que pode vir à mente
é criar duas tabelas: parents para
pais e sons para filhos. Em seguida, relacionar
essas tabelas por meio de algum campo: son_id
ou parent_id.
No entanto, essa ideia não é muito boa - pois a mesma pessoa pode ser simultaneamente pai e filho - e será necessário armazená-la em ambas as tabelas, o que é inconveniente, ocupa mais espaço e pode facilmente levar a erros.
Uma opção melhor é relacionar a tabela consigo
mesma: vamos criar uma tabela users,
nela armazenaremos todos os usuários e para cada um criaremos
um campo son_id, no qual será armazenado
o id do filho desta mesma tabela:
| id | name | son_id |
|---|---|---|
| 1 | user1 | 2 |
| 2 | user2 | 3 |
| 3 | user3 | null |
Consultas
Agora vamos escrever uma consulta que buscará o usuário junto com seu filho.
Para começar, vamos apenas buscar os usuários:
SELECT
*
FROM
users
Agora vamos fazer um JOIN com os filhos. Faremos o JOIN da tabela consigo mesma, portanto precisamos renomeá-la:
LEFT JOIN users as sons
Agora podemos especificar a relação entre a tabela principal e a tabela renomeada:
LEFT JOIN users as sons ON sons.id=users.son_id
Agora vamos especificar os campos:
SELECT
users.name as user_name, sons.name as son_name
Juntando tudo, obtemos a seguinte consulta:
SELECT
users.name as user_name, sons.name as son_name
FROM
users
LEFT JOIN users as sons ON sons.id=users.son_id
Tarefas práticas
Suponha que temos categorias. Cada categoria pode pertencer a uma categoria pai, que por sua vez pertence à sua própria categoria pai e assim sucessivamente. Descreva a estrutura de armazenamento.
Escreva uma consulta que buscará a categoria junto com sua categoria pai.
Escreva uma consulta que buscará a categoria junto com seu pai e seu avô (pai do pai).
Escreva uma consulta que buscará a categoria junto com seu pai, seu avô e seu bisavô.