小编Que*_*cia的帖子

适用于i18n的FuelPHP ORM数据库架构,意见/建议

虽然这个问题可能 其他许多问题类似, 我想就FuelYP上针对i18n的最佳方法提出意见/建议.

所以,这是我到目前为止所得到的:

数据库架构#1:

models (id, name_pt, name_es, name_en, description_pt, description_es, description_en)
Run Code Online (Sandbox Code Playgroud)

样本数据#1:

(1, 'Modelo', 'Modelo', 'Model', 'Descrição do modelo', 'Descripción del modelo', 'Model description')
Run Code Online (Sandbox Code Playgroud)

优点:

  • 直接而简单
  • 每个型号一张表
  • 无需使用JOIN
  • 使用魔术方法简化数据访问:

 

public function & __get($property)
{
    if (array_key_exists($property, array('name', 'description')))
    {
        $property = $property.'_'.Session::get('lang_code');
    }

    return parent::__get($property);
}
Run Code Online (Sandbox Code Playgroud)

这样,我就可以打电话了:

$model->name;
$model->description;
Run Code Online (Sandbox Code Playgroud)

代替:

$model->{'name_'.Session::get('lang_code')};
$model->{'description_'.Session::get('lang_code')};
Run Code Online (Sandbox Code Playgroud)

缺点:

  • 拥有大量语言/翻译字段可能会变得混乱.
  • 添加新语言意味着向表中添加新字段
  • 魔术方法仅在我们已有ORM实例/对象时才有效.要通过由翻译字段排序的查询构建器来获取ORM实例,它仍然需要以下代码:

 

Model_Model::query()
    ->order_by('name_'.Session::get('lang_code'))
    ->get();
Run Code Online (Sandbox Code Playgroud)

数据库架构#2:

languages (id, code, name)
models (id)
i18n_models (id, …
Run Code Online (Sandbox Code Playgroud)

database orm internationalization fuelphp

5
推荐指数
1
解决办法
589
查看次数

标签 统计

database ×1

fuelphp ×1

internationalization ×1

orm ×1