将ORM用于多语言网站

时间:2011-05-24 20:29:20

标签: php orm localization

我想问一下使用ORM(通过MySQL)和PHP的建议。直到今天我还是CodeIgniter用户,但现在我想用FUEL(http://fuelphp.com)进行编码并且他们有一个ORM。

我的问题是,我要编码的网站中有75%有两种或更多语言并且数据会重复(lang1,2,3的标题... lang1,2,3 ......的描述)。其实我是用CodeIgniter做的:

$data = $this->db->where('id', $id)->get('pages')->row();

if(false == $data)
    return false;

$this->db->where('module', 'pages')->where('pk', $data->id)->where("locale", $locale);

$query = $this->db->get("translations");

foreach($query->result() as $row)
    $result->{$row->label} = $row->value;

$result->_data = $data;

使用MySQL结构:

CREATE  TABLE IF NOT EXISTS `pages` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  `id_user` MEDIUMINT(8) UNSIGNED NOT NULL ,
  `id_parent` INT NULL DEFAULT 0 ,
  `order` INT NULL DEFAULT 0 ,
  `template` INT NULL DEFAULT 1 ,
  `image` VARCHAR(125) NULL ,
  `flag_active` TINYINT NOT NULL DEFAULT 1 ,
  `flag_shop` TINYINT NOT NULL DEFAULT 0 ,
  `modified` INT NULL ,
  `created` INT NULL ,
  PRIMARY KEY (`id`) )
ENGINE = InnoDB;

CREATE  TABLE IF NOT EXISTS `translations` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  `id_user` MEDIUMINT(8) UNSIGNED NOT NULL ,
  `locale` VARCHAR(45) NOT NULL ,
  `module` VARCHAR(45) NOT NULL ,
  `pk` INT NOT NULL ,
  `label` VARCHAR(45) NOT NULL ,
  `value` TEXT NULL ,
  `modified` INT NULL ,
  `created` INT NULL ,
  PRIMARY KEY (`id`) )
ENGINE = InnoDB;

我认为它是自描述的,但首先我添加一个页面,然后,对于每个页面,我添加一个带有module = table_name,locale = language,pk = id_page,label = title / description / ...的翻译条目,值=值。

我想进一步发展,看看我如何能够以更好的方式使用ORM,快速开发的最佳方式等等。

提前谢谢!

1 个答案:

答案 0 :(得分:1)

要使用我们的Orm进行设置,首先需要创建模型。使用MySQL时,您不一定需要配置属性,但无论如何我都会这样做,因为它会为每个模型保存一个查询以查找它们。

Model_Page

class Model_Page extends Orm\Model {

    protected static $_properties = array(
        'id',
        'id_user',
        'id_parent' => array('default' => 0),
        'order' => array('default' => 0),
        'template' => array('default' => 1),
        'image',
        'flag_active' => array('default' => 1),
        'flag_shop' => array('default' => 0),
        'modified',
        'created'
    );

    protected static $_has_many = array(
        'translations' => array(
            'key_to' => 'pk',
        ),
    );

    protected static $_belongs_to = array(
        'parent' => array(
            'model_to' => 'Model_Page',
            'key_from' => 'id_parent',
        ),
    )
}

Model_Translation

class Model_Page extends Orm\Model {

    protected static $_properties = array(
        'id',
        'id_user',
        'locale',
        'module',
        'pk',
        'label',
        'value',
        'modified',
        'created'
    );

    protected static $_belongs_to = array(
        'page' => array(
            'key_from' => 'pk',
        ),
    )
}

你的查询就变成了这个:

$page = Model_Page::query()
    ->related('translations')
    ->where('id', $id)
    ->where('translations.module', 'pages')
    ->where('translations.locale', $locale)
    ->get();

if (empty($page))
{
    return false;
}

$result = array();
foreach ($page->translations as $t)
{
    $result[$t->label] = $t->value;
}
$result['_data'] = $page;

Check the docs了解更多解释和示例。