Автоматически выбирать конкретный магазин с проектом 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 для этого. Вы можете увидеть здесь.

Это хорошая практика, чтобы переопределить проекцию по умолчанию? У тебя есть другая идея?

1 ответ

Решение

Из того, что я понимаю, вы хотите сохранить переводы, используя поле 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 класс расширен другими моделями.

Другие вопросы по тегам