我正在CodeIgniter上创建一个多语言应用程序,我对如何以正确的方式制作数据库感到困惑。
我之前已经做过,但是使用“最简单”的方法:


表新闻

id
title_en
title_de
title_rus
title_fr


等等...
它很容易,因为插入数据库是由一个查询完成的,也从一个查询中选择,很容易。
当我想为用户显示所需的语言时,我只会选择与之对应的字段。
使用这种方法,依赖数据库的所有内容都很容易(插入,选择,更新)。
但是,当我需要添加另一种语言时,有很多事情需要更改。
所以我想让我们尝试将每种语言都不同的所有文本字段放在另一个表中。

表新闻

id
date
author


表格news_lang

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数据库对象,而是创建一个工厂,该工厂将根据配置语言为我提供所需的模型。然后从那时起,您将使用从工厂获得的任何db对象,就好像只有一种语言一样。

像这样的东西:

$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)
    }
}

关于php - CodeIgniter和多语言数据库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26226411/

10-16 11:11