Я хочу легко выбрать несколько строк с определенным ключом 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" |
+----+----------------+-------------------------+
Я хочу получить этот результат с Помм Проект. Для этого я создаю расширяемый ModelI18n для этого. Ты можешь видеть Вот.
Это хорошая практика, чтобы переопределить проекцию по умолчанию? У тебя есть другая идея?
Из того, что я понимаю, вы хотите сохранить переводы, используя поле 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
класс расширен другими моделями.
Других решений пока нет …