Kohana (KO3) Tabela dinâmica universal ORM (campos: model1, model1_id, model2, model2_id) - possível?
-
28-10-2019 - |
Pergunta
Tenho a seguinte configuração de modelos:
User
- has_many File (for userpics)
Gallery
- has_many File (for images)
Page
- has_one File (for background image)
O objeto Página pode compartilhar um objeto Arquivo com um ou mais objetos Galeria como plano de fundo.E em algum estágio posterior, um novo modelo como
Product
- has_many File
ou semelhante pode aparecer no aplicativo.
Observe que preciso de um modelo de arquivo em vez de apenas armazenar caminhos para os arquivos reais porque o modelo de arquivo pode fazer referência, de fato, a vários arquivos no sistema de arquivos
File
- id
- path
- path_poster
- path_m4v (HTML5 videos need up to three files for compatibility)
- path_webm
- path_ogv
- width
- height
- poster_width
- poster_height
- type
- ... etc....
Então, há uma maneira simples (sem sobrescrever toda a classe ORM) de implementar relacionamentos que usariam uma tabela dinâmica "genérica" com os seguintes campos:
model_name VARCHAR(8) (or model_type_id TINYINT for speed)
model_id INT
file_id INT
relation_name VARCHAR(8) (e.g., Page model can have "background" and "logo" relation)
position INT
O motivo: eu quero ter um módulo de aplicativo universal para verificar se há arquivos "órfãos" e também ser capaz de dizer a que cada arquivo está anexado, por exemplo, ao excluir um arquivo da Galeria, o aplicativo fariaavisar que o arquivo ainda está anexado a uma página como plano de fundo.
Solução
A resposta curta é não.O motivo é porque model_id entraria em conflito com outros IDs de modelo.Se você quiser, pode fazer um índice exclusivo em model_name + model_id, mas para unir essas duas colunas seria necessário reescrever os métodos ORM para unir os modelos por meio de seus relacionamentos.
Honestamente, preferiria tabelas dinâmicas simples.