Я создаю мультиязычное приложение на CodeIgniter, и я немного запутался в вопросе о том, как сделать базу данных правильным образом.
Я делал это раньше, но используя «самый простой» подход:
id
title_en
title_de
title_rus
title_fr
и так далее…
Это просто, потому что вставка в базу данных выполняется одним запросом, выбор также из одного запроса, легкая работа.
И когда я хочу отобразить язык, который мне нужен для пользователя, я выбираю только поле, которое соответствует.
Используя этот подход, все, что зависит от базы данных, легко (вставить, выбрать, обновить).
Но когда мне нужно добавить другой язык, многое нужно изменить.
Поэтому я подумал, что давайте попробуем поместить все текстовые поля, которые различны для каждого языка, в другую таблицу.
id
date
author
id
news_id
title
language
Поэтому я разделил его на две таблицы, которые должны устранить проблему с новыми языками для меня, и это должно сделать базу данных более чистой.
С выбором текущего языка проблем нет:
$this->db->select("news.id, news.date, news.author, news_lang.title");
$this->db->join("news_lang", "news_lang.news_id = news.id");
$this->db->where("news.id", $news_id);
$this->db->where("news_lang.language", $language);
$this->db->get("news")->row();
Но что делать, если для редактирования мне нужны все языковые поля?
Возможно, мне придется установить их на другой объект или массив, который не так хорош.
И главный вопрос, который заставляет меня задаться здесь — как вставить все данные?
При первом подходе я делал вещи в одном методе в модели. Теперь я не думаю, что есть какой-то другой путь без использования какого-либо цикла.
Я использую неправильную логику? Есть ли другой «чистый» способ сделать это?
Я думал о том, чтобы поместить все данные в одно поле, не создавая две таблицы, а сделав сериализацию или кодировку данных языка с помощью json, а затем поместив их в одно поле, но я не совсем уверен, что это отличная идея.
Не могли бы вы дать мне какие-нибудь советы?
Спасибо,
Майк
То, что я хотел бы сделать, это иметь отдельные таблицы для каждого языка, и тогда я бы не стал напрямую обращаться к объекту базы данных codeigniter, а скорее создал бы фабрику, которая давала бы мне нужную модель в зависимости от того, для какого языка я ее настроил. затем с этого момента вы будете использовать любой объект БД, полученный на фабрике, как если бы был только один язык.
что-то вроде этого:
$myDBmodel = $this->dbFactory('news','fr');
$myDBmodel->select("id, date, author, etc...");
тогда есть фабрика:
function dbFactory($table, $language) {
switch($language) {
case 'fr':
(psudocode: return french version of db model)
default:
(psudocode: return whatever your default language version of the model is)
}
}
Других решений пока нет …