Em primeiro lugar, peço desculpas por vincular esta pergunta a outra, mas essa foi a melhor maneira que pude pensar para mantê-la simples e focada
Meses atrás fui apresentado ao supertipo-subtipo como solução para um problema que era mais ou menos fácil de apresentar mas não estava conseguindo resolver
Eu entendi o conceito básico e consegui fazê-lo funcionar com meu modesto conhecimento e funcionou muito bem, considerando que a pergunta original tem mais de um ano.
Porém hoje me deparei com um problema que não consegui resolver: Internacionalização
Até agora eu tinha uma tabela nomeada i18n
com uma FOREIGN KEY apontando para a PRIMARY KEY da tabela do supertipo ( Items
) assim como todos os subtipos ( Car
, Boat
e Plane
) e ao consultar, entre todas as colunas de todos os subtipos, incluo a coluna nesta tabela de internacionalização com as strings traduzidas juntando tudo pela chave do supertipo.
Algo assim:
Items
estrutura:
+----+---------------------+---------------------+
| PK | Common Attribute #1 | Common Attribute #2 |
+----+---------------------+---------------------+
Car
estrutura:
+----+-----------+--------------+--------------+
| PK | Reference | Attribute #1 | Attribute #2 |
+----+-----------+--------------+--------------+
Boat
estrutura:
+----+-----------+--------------+--------------+--------------+
| PK | Reference | Attribute #1 | Attribute #2 | Attribute #3 |
+----+-----------+--------------+--------------+--------------+
Plane
estrutura:
+----+-----------+--------------+--------------+--------------+--------------+
| PK | Reference | Attribute #1 | Attribute #2 | Attribute #3 | Attribute #4 |
+----+-----------+--------------+--------------+--------------+--------------+
i18n
estrutura:
+----+-----------+------+
| PK | Reference | Text |
+----+-----------+------+
Reference
é a CHAVE ESTRANGEIRA
Não tenho certeza se essa é a melhor abordagem, mas funciona porque até agora apenas uma das colunas tinha texto passivo de internacionalização — digamos Attribute #1
. No entanto, hoje, notei que um dos subtipos precisaria de duas colunas para ser traduzido e o jeito que eu estava fazendo era considerar apenas uma — digamos Attribute #4
de Planes
Table.
Eu gostaria de fazer isso diretamente no nível do banco de dados, em vez de ter alguma palavra-chave representativa para substituir a linguagem do lado do servidor.
Tentei fazer uma subconsulta para que essa segunda coluna fosse traduzida mas, além de não funcionar, isso estava me cheirando mal.
Como eu poderia fazer isso?
[EDITAR]
Achei melhor postar minha última tentativa:
SELECT
`items`.`cid` AS `id`, `items`.`reference`, `items`.`GUID`, # That's Users' Items Table
`core`.`image`, `core`.`type`, `core`.`class` AS `classname`, # That's the supertype
`cars`.`attribute1`, `cars`.`attribute2`,
`boats`.`attribute1`, `boats`.`attribute2`, `boats`.`attribute3`,
`planes`.`attribute1`, `planes`.`attribute2`, `planes`.`attribute3`, `planes`.`attribute4`,
FROM `items`
LEFT OUTER JOIN core ON( ( items.reference = core.iid ) )
LEFT OUTER JOIN `catalog`.`cars` cars ON( items.reference = cars.reference )
LEFT OUTER JOIN `catalog`.`boats` boats ON( items.reference = boats.reference OR items.reference = boats.attribute3 )
LEFT OUTER JOIN `catalog`.`planes` planes ON( items.reference = planes.reference )
LEFT OUTER JOIN users ON( items.UserId = users.id )
LEFT OUTER JOIN i18n ON( items.reference = i18n.reference )
WHERE `i18n`.`langCode` = 'en'
AND ( `items`.`GUID` = '4cca0b05-84b0-40af-8808-2379b32df35f' OR `items`.`GUID` = '41a0917e-8ccf-43a3-b52a-0ae0a09a2374' )
ORDER BY ( FIELD( `items`.`GUID`, '4cca0b05-84b0-40af-8808-2379b32df35f','41a0917e-8ccf-43a3-b52a-0ae0a09a2374' ) )
Para este exemplo, usei o subtipo Boats
para demonstrar a outra coluna que poderia/deveria ser traduzida.
Posso recuperar todos os dados necessários de todos os subtipos de uma só vez com esta consulta. Ele terá várias colunas, NULL
mas ao buscar dados, com PHP ( PDO::FETCH_NAMED
, para o que importa) tudo funciona.
Mas não estou conseguindo retornar a coluna com o texto ( i18n.text
), apenas seu Reference ID que corresponde ao supertipo Table ( Items.reference
).
Eu sei, eu sei, não estou incluindo isso como uma coluna a ser recuperada, mas, se o fizer, a primeira coluna traduzível ( ) funciona, mas attribute1
qualquer outra, que qualquer subtipo possa ter (aqui boats.attribute3
) duplica o valor de atribute1
de puxar seu próprio valor referenciado.