使用pomm项目自动选择特定的hstore

时间:2015-09-03 20:17:41

标签: php postgresql pomm

我希望使用特定的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

覆盖默认投影是一个好习惯吗?你有其他想法吗?

1 个答案:

答案 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类中。