使用Codeigniter构建多语言数据库

3

我在数据库设计中应用了附加翻译方法

relationship

由于表的结构如此,每个查询的代码变得更加复杂。

我的 PHP 代码在 models 中:

<?php
// SHOW ALL RECORDS
$this->db->select('m.id, m.title, m.content');

$table = 'blog';
if (MULTILINGUAL) {
    $this->db->from($table.' AS m');

    $this->db->select('t.title, t.content');
    $this->db->join($table.'_translation AS t', 'm.id = t.parent_id', 'left');
    $this->db->where('t.language_id', LANGUAGE);

    $query = $this->db->get();
} else $query = $this->db->get($table.' AS m');
?>

所以我想改变它的代码...


MULTILINGUALtrue时,并且每个查询具有列字段titlecontent,...

$table = 'blog';
$this->db->select('id, title, content');
$query = $this->db->get($table);

它将自动使用带有后缀_translation的表的方法JOIN(如上面的代码)。

否则,查询应该像普通查询一样运行。

我如何修改db类但不影响Codeigniter的核心系统?


PHP代码(使用Codeigniter):

// Query 1:
$this->db->select('id, title, content');
$query = $this->db->get('blog');

// Query 2:
$this->db->select('id, title, content');
$this->db->where('id', 1);
$query = $this->db->get('blog');

生成$this->db->last_query()
if (MULTILINGUAL) {
    // Query 1:
    // SELECT t.title, t.content FROM blog AS m LEFT JOIN blog_translation AS t ON m.id = t.parent_id WHERE t.language_id = 1

    // Query 2:
    // SELECT t.title, t.content FROM blog AS m LEFT JOIN blog_translation AS t ON m.id = t.parent_id WHERE t.language_id = 1 WHERE m.id = 1
else {
    // Query 1:
    // SELECT title, content FROM blog

    // Query 2:
    // SELECT title, content FROM blog WHERE id = 1
}

我希望它能完全自动化。

我认为可以通过更改db类来解决这个问题,但直接干预核心系统是不稳定的(在核心更新中)...

非常感谢您帮助我解决我的问题!


你是从哪里获取模型中 MULTILINGUAL 的值的? - Narendrasingh Sisodia
我将其设置在config/constants.php文件中。 - UserNaN
2个回答

1

这可能会帮助你解决问题。我不知道你如何使用那个配置文件,但是可以实现该功能。

function your_function($multilingual = false) {
    $table = 'blog';
    if ($multilingual === true) {
        $this->db->select('t.title, t.content');
        $this->db->join($table . '_translation AS t', 'm.id = t.parent_id', 'left');
        $this->db->where('t.language_id', LANGUAGE);
        $query = $this->db->get($table . ' AS m')->result_array();
    } else {
        $this->db->select('m.id, m.title, m.content');
        $query = $this->db->get($table . ' AS m')->result_array();
    }
    return $query;
}

谢谢,但那不是我想要的...我刚刚更新了我的问题,描述可能更详细地说明了我想要的内容,你可以回头看看,希望你或其他人能够帮助我! - UserNaN
这可以通过我的代码实现,您需要按照上面展示的方式放置查询。我这样发布是因为我不知道您如何处理多语言问题。 - Narendrasingh Sisodia
谢谢,我刚有一个想法要修改模型,显然可以解决我的问题! - UserNaN
(供参考:如果我的回答对您有帮助,请接受或点赞。) - Narendrasingh Sisodia

0
你可以创建一个视图并调用:$this->db->where('t.language_id', LANGUAGE);,但我不确定这是否是更好的解决方案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接