Doctrine2: сопоставление ассоциации для таблицы с несколькими внешними ключами - PullRequest
3 голосов
/ 04 сентября 2011

Мой друг и я работаем над многоязычным веб-приложением для хранения рецептов. Мы используем Доктрину 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 и связал его с менеджером сущностей доктрины. Но это отчасти уродливо - я думаю, что модельные классы не должны отвечать за постоянство. Во время написания моего вопроса я думал, что решение может быть своего рода классом Фабрики. Это вывело бы всю логику постоянства из модели и могло бы обрабатывать особые случаи.

Что ты думаешь? Какое лучшее решение?

С наилучшими пожеланиями в совете

Пол

1 Ответ

1 голос
/ 06 июля 2012

Задумывались ли вы о добавлении прослушивателя событий для onFlush?по сути, во флэш-памяти вы проверяете, какой объект сохраняется, а затем выполняете некоторый код, например, создаете объект Mnemonic.

Информацию о регистрации событий onFlush можно найти на веб-сайте доктрины по следующей ссылке:1004 *

http://docs.doctrine -project.org / projects / doctrine-orm / en / 2.0.x / reference / events.html # onflush

...