Мой друг и я работаем над многоязычным веб-приложением для хранения рецептов. Мы используем Доктрину 2.1.1 для настойчивости. На данный момент я остановился на создании моделей для сущности и надеюсь, что кто-нибудь может дать мне подсказку или показать лучшую практику для нашего случая.
Я постараюсь объяснить наш ERD широко. Не стесняйтесь спрашивать, если есть что-то непонятное. В нашем приложении есть сущности recipe
, ingredients
, units
(единицы измерения для ингредиентов) и categories
. Каждый из этих объектов хранится в собственной таблице. Каждый объект может быть переведен на несколько языков. Хранение переводов предназначено в виде таблицы (назовите ее) translations
.
Теперь это будет немного сложно ... у нас есть дополнительная таблица с именем mnemonic
. Мы используем его для определения рецептов, ингредиентов, категорий и единиц измерения в глобальном контексте ... лучшая аналогия с этим - GUID, я думаю. Мнемоника также помогает нам составлять карту между рецептами, ингредиентами и т. Д. И их переводами.
Мнемоническая таблица состоит из пяти строк: id
(первичный ключ) и четырех дополнительных строк метаданных: ingredient_id
, recipe_id
, category_id
и unit_id
, ссылающихся на отношения 1: 1 с первичным ключом их родственники.
Я спрашиваю себя, как я могу отобразить отношения между мнемонической сущностью и рецептами, ингредиентами и так далее.
Или (если быть более точным), как можно автоматически заполнить category_id
в мнемонической таблице значением первичного ключа таблицы категорий?
Сначала я попробовал этот вид сопоставления ассоциаций в моей модели категории:
class Category
{
/**
* @var integer $id
*
* @Column(name="id", type="bigint", nullable=false)
* @Id
* @GeneratedValue(strategy="IDENTITY")
* @OneToOne(targetEntity="Mnemonic", mappedBy="category")
* @JoinColumn(name="id", referencedColumnName="category_id")
*/
private $id;
и в модели Mnemonic:
class Mnemonic
{
/**
*
* @OneToOne(targetEntity="Category", inversedBy="mnemonic")
* @JoinColumn(name="category_id", referencedColumnName="id")
*/
private $categoryId;
Это не сработало - Doctrine не выдает никаких ошибок, но заполняет только таблицу категорий.
Поэтому я подумал, что мог бы написать некоторый код в методе __construct
модели Category, где я бы создал объект Mnemonic, установил его categoryId в соответствии с идентификатором модели Category и связал его с менеджером сущностей доктрины. Но это отчасти уродливо - я думаю, что модельные классы не должны отвечать за постоянство.
Во время написания моего вопроса я думал, что решение может быть своего рода классом Фабрики. Это вывело бы всю логику постоянства из модели и могло бы обрабатывать особые случаи.
Что ты думаешь? Какое лучшее решение?
С наилучшими пожеланиями в совете
Пол