Как правильно организовать связи в таблицах для динамического перевода на свйте
Нужно сделать систему переводов, но не могу правильно составить связи в таблицах…
Есть набор таблиц
news, posts, page_metadata, translations и translation_keys
В таблице translations поля id, language_id, translator_key_id, content, singular в таблице translation_keys поля id, key
Допустим нужно создать переводы (meta) для поста, в таблице translation_keys создаю записи с ключами post.meta_content_title, post.meta_content_description после чего в таблице translations создаю все названия и описания на нужном языке (поле singular используется для уникальности, чтоб нельзя было создать один и тот же ключ с таким же языкам) далее в таблице page_metadata с набор полей id, translation_id, page_type, relation_id создаю запись в которой указано translation_id на нужный перевод, page_type используется для обозначения какой тип используется (в данном случае посты, это для того чтоб знать на какую запись ссылается поле relation_id), relation_id указываю для какого поста эта запись, если запись должна быть для общих страниц таких как о нас, контакты… поле relation_id идет null.
Теперь если мне нужно выбрать перевод meta к примеру для главной страницы сайта я делаю запрос
select * from page_metadata pm inner join translations t on t.id = pm.translation_id inner join languages l l.id = t.language_id inner join translation_keys tk tk.id = t.translation_key_id where page_type is null and l.code = ‘ru-RU’ and tk.key in (‘main.meta_content_title’, ‘main.meta_content_description’)
Все работает, но мне кажется что я что-то делаю не так, как-то слишком много таблиц и все очень запутанно, а также нет способа выбрать другой язык есть записи на запрашиваемом нет
Может у кого есть опыт в реализации таких механизмов?
P.S. Использую ларавель и базу постгрес
Ответы (1 шт):
Использовать готовую библиотеку. например https://github.com/spatie/laravel-translatable
ps полям с переводами в БД сменить тип на json