我希望使用特定的hstore密钥轻松选择多行。这里是“fr”键。 您可以看到以下结构:
+----+----------------+-------------------------+
| id | name_i18n | description_i18n |
+----+----------------+-------------------------+
| 1 | "fr"=> "nom 1" | "fr"=> "Description 1" |
+----+----------------+-------------------------+
| 2 | "fr"=> "nom 2" | "fr"=> "Description 2" |
+----+----------------+-------------------------+
| 3 | "fr"=> "nom 3" | "fr"=> "Description 3" |
+----+----------------+-------------------------+
我想用Pomm Project获得此结果。为此,我为此创建了一个可扩展的ModelI18n。您可以看到here。
覆盖默认投影是一个好习惯吗?你有其他想法吗?
答案 0 :(得分:0)
据我了解,您希望使用HStore字段保存翻译。
模型类通过投影将数据库关系链接到PHP实体,因此投影意味着重载。
<?php
class MyEntityModel extends Model
{
protected $culture = 'en';
public function setCulture($culture)
{
$this->culture = $culture;
return $this;
}
public function createProjection()
{
return parent::createProjection()
->unsetField('name_i18n')
->setField(
'name',
sprintf("%%:name_i18n:%%->'%s'", $this->culture),
'varchar'
)
->unsetField('description_i18n')
->setField(
'description',
sprintf("%%:description_i18n:%%->'%s'", $this->culture),
'text'
)
;
}
}
此预测会使常规查询类似
$entity = $pomm
->getDefaultSession()
->getModel(MyEntityModel::class)
->setCulture('fr')
->findByPk(['id' => $id])
;
/*
SELECT
id as id,
name_i18n->'fr' as name,
description_i18n->'fr' as description
FROM
a_schema.a_table
WHERE
id = $*
*/
echo $entity['name']; // nom 1
echo $entity['description']; // Description 1
您可以完全相同的方式使用JSONB字段。
您提供的createProjection
方法更通用,可以在其他模型扩展的GenericModel
类中。