Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Relacionamentos complexos

Fala Vinicius, beleza?

Cara, eu estava treinando os conhecimentos adquiridos com o curso e me deparei com o problema de ter um relacionamento many-to-many com 3 entidades e não sabia qual melhor solução para isso.

Eu achei essa solução mas queria saber se você conhece outra ou se usa essa mesma abordagem. Eu achei meio estranha essa abordagem por que trata uma tabela auxiliar como se fosse uma entidade.

6 respostas

Fala, Diego! Tranquilo, cara?

Me passa o seu exemplo específico desse relacionamento pra eu pensar numa forma legal de mapear. :-D

Opa Mestre

Então, eu consegui modelar o banco certinho com SQL puro, mas no doctrine está faltando um detalhe, vou explicar:

Eu criei um banco com algumas entidades e três dessas entidades são Produto, Lista e Pontuação. A lógica de negócio é a seguinte: Eu tenho listas mensais onde cadastro produtos e sua respectiva pontuação no determinado mês, obviamente não tenho produtos repetidos em uma mesma lista, mas pode haver produtos com a mesma pontuação.

Por exemplo:


Lista de março de 2020 -> Celular-> 50 pontos

Lista de março 2020 -> Notebook -> 50 pontos

Lista de março de 2020 -> Cafeteira -> 100 pontos

Lista de abril de 2020 -> Celular -> 60 pontos


No SQL puro eu modelei criando uma tabela "lista_produto" onde relaciono Produto e Lista onde ambos id's são a chave primária ( uma relacao de N:N) e mais um campo onde guardo a pontuação . Ficando resumidamente assim:

lista_produto:

id_produto,

id_lista,

id_pontuacao

PK(id_lista,id_produto),

FK(id_lista), FK(id_produto), FK(id_pontuacao)

Falando agora de doctrine, eu consigo gerar essa tabela "lista_produto" normalmente como foi ensinado no curso criando uma relação de many-to-many no meu mapeamento de Lista, porém, preciso enxertar a pontuação nessa join table tb. O many-to-many dentro do mapeamento de Lista e no qual preciso ter a pontuação tb:

    <many-to-many field="produtos" target-entity="App\Entity\Produto">
        <join-table name="lista_produto">
            <join-columns>
                <join-column name="id_lista" referenced-column-name="id_lista" />
            </join-columns>
            <inverse-join-columns>
                <join-column name="id_produto" referenced-column-name="id_produto" />

            </inverse-join-columns>
        </join-table>
    </many-to-many>

solução!

Fala, Diego. Desculpa a demora. Eu não recebi e-mail dessa pergunta. Me lembrei hj que vc tava com uma dúvida complexa e vim procurar no fórum.

Então, cara, nesse caso, acho que até sem pensar no mapeamento, a modelagem no mundo Orientado a Objetos pediria uma entidade esterna pra relacionar Produto e Pontuação com a Lista.

De cabeça eu não consigo pensar em uma solução melhor do que a apresentada na resposta não...

=/

Oi Mestre, valeu por lembrar.

Eu havia tentado fazer da forma que está no stack overflow, mas nesse dia eu estava com sono e acho que não fiz corretamente. Esses dias estive ocupado estudando outras coisas, hoje vou retornar para esse problema e com certeza consigo resolver, depois informo se obtive êxito.

Esse problema me fez refletir como é difícil alinhar o modelo OO com o modelo relacional, mas ainda estou começando, aos poucos vou ganhando essas expertises.

Abraço

Fico no aguardo da sua solução aqui pra eu poder aprender também.

Eu nunca passei por um caso desses, então nunca precisei resolver. haha

Boa sorte aí e bons estudos!

Fala Mestre,

Criando uma entidade extra para relacionar as outras três realmente deu certo, finalizei esse curso já faz um tempo mas tenho estudado outras coisas, em breve estarei no seu último curso sobre o Doctrine.

Grande abraço!