Автоматически выбирать конкретный магазин с проектом 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"  |
+----+----------------+-------------------------+

Я хочу получить этот результат с Помм Проект. Для этого я создаю расширяемый ModelI18n для этого. Ты можешь видеть Вот.

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

2

Решение

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]