我想问一下使用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,快速开发的最佳方式等等。
提前谢谢!
答案 0 :(得分:1)
要使用我们的Orm进行设置,首先需要创建模型。使用MySQL时,您不一定需要配置属性,但无论如何我都会这样做,因为它会为每个模型保存一个查询以查找它们。
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',
),
)
}
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了解更多解释和示例。