6
respostas

Dúvida quanto à herança

Boa tarde!

No sistema que desenvolvi, utilizei a premissa de um web home streaming no qual filmes e séres estariam disponíveis para que o usuário os assistisse. Optei por abstrair parte das entidades Movie e Series para uma entidade pai chamada AudioVisual, em qual conteria, dentre a maioria dos atributos, o Title, que serviria como chave primária tanto para Movie quanto para Series.

O problema surgiu quando precisei criar o banco de dados. Ao fazê-lo, recebi um erro na linha de comando explicando que havia algo de errado com a/o "Inheritance Mapping". Pesquisando na documentação do Doctrine, constatei que havia uma configuração a mais para ser feita quando se trata de um sistema entre classes e subclasses (herança). Li brevemente esse trecho da documentação e, por dúvida, decidi questionar aqui antes de tomar uma decisão.

Minha intenção é criar uma tabela própria para Movie e Series de forma que, herdando da classe pai AudioVisual, ambas contraiam os atributos nesta contidos, inclusive o atributo Title, que é a chave primára de ambas as tabelas. Alguém conseguiria me ajudar? Consegui me fazer entender bem?

6 respostas

Mas qual sua dúvida, Diogo?

Usando Doctrine você consegue mapear suas entidades para que ambas as tabelas possuam as colunas ou para que uma tabela separada seja criada com as colunas em comum.

Lendo a documentação, qual parte não ficou clara?

Bom dia, instrutor.

Eu pesquisei na documentação, minha dúvida se refere ao atributo Single Table Inheritance e Class Table Inheritance que podem ser atribuídos à entidade. Como expliquei acima, eu tive um problema na hora de fazer o mapeamento das entidades e criar o banco de dados; o erro dizia que esse atributo não havia sido especificado. Embora eu tenha certa ignorância quanto a isso por estar aprendendo, acredito que seja causado pela herança.

Apenas para mais informações, a classe pai abstrata AudioVisual contém duas classes-filhas, Movie e Series. A classe pai também contém o tributo Title, que é a chave primaria de ambas as classes-filhas.

(OBS: gosto muito do teu trabalho, professor Vinicius.)

Então, você precisa definir qual abordagem vai seguir, das duas opções, e adicionar o atributo à entidade pai. Lendo a documentação, alguma parte em específico não ficou clara?

Boa tarde.

Minha dúvida é com relação ao resulto que obterei utilizando Single Table Inheritance e Class Table Inheritance. Quando eu criar as tabelas, quero que Movie e Series sejam duas tabelas diferentes, cada uma com os atributos herdados da classe pai, AudioVisual. Não sei qual dos dois devo usar e quais parâmetros a mais passo a eles, ou se mesmo é com eles que chego ao resultado que espero.

Se você só tem a classe base fornecendo os atributos em comum, provavelmente usar ela como Mapped Superclass deve ser o suficiente.

Acho que o melhor cenário para você entender melhor as 3 possibilidades é simplesmente experimentá-las. Realize o mapeamento no seu projeto e gere o schema. Veja o que o Doctrine entende desse mapeamento e use o que mais se adequar a seu caso. :-)

Tem um curso antigo de Doctrine aqui na Alura que falava sobre herança. Me diz se você consegue acessar ele:

https://cursos.alura.com.br/course/php-doctrine-indices-heranca-sql-nativo/task/63883

Ele mapeia em XML ao invés de usar atributos e as versões são um pouco mais antigas, mas os conceitos se mantém.