Задать вопрос
MaEcTPo
@MaEcTPo

Испольование в одной таблице пары instance_id, instance_type в Doctrine

Здравствуйте,

столкулся с проблемой в doctrine.

Представьте есть три основных таблицы — participant, team, region.
Еще одна, пусть называется log, в которой храняться абсолютно одинаковые по структуре данные — rank, points, position и так далее для каждого объекта из первых таблиц.

Необходимо сделать так, чтобы по instance_id и instance_type можно было связать две таблицы — log и какую-то из основных, в зависимости от instance_type.

На первый взгляд все довольно просто, но после того как описал через обычный Doctrine_Query::create() и leftJoin, или через Doctrine_RawQuery::create() выдается ошибка, что не можен провести «гидрацию», т.к. у объекта Log нету связи на instance.

Если кто-то стыкался с такой трудностью, подскажите, пожалуйста, решение.
  • Вопрос задан
  • 2444 просмотра
Подписаться 2 Оценить Комментировать
Решения вопроса 1
Использую Doctrine ODM + MongoDB :)

Если не подходит такой вариант рассмотрите возможность создания общего примарикей (возможно ещё какие-то поля будут общие) для инстансов, то есть вместо instance_id и instance_type в log хранится inctance_id, но он общий для двух таблиц и связь происходит либо непосредственно через него (тогда надо обеспечить уникальность id в обеих таблицах, простой автоинкремент не подойдёт), либо создать ещё одну таблицу с полями id (автоинкрементное, по которому связь идёт с log), instance1_id, instance2_id + другие общие поля. В общем паттерн «наследование с таблицами для каждого класса» (если не напутал).

Как-то пробовал решать подобную задачу, но у меня число типов было неограниченно и одним SQL так и не смог её решить
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
zizop
@zizop
А почему не добавить связь, как того хочет Doctrine?
participant hasMany log,
team hasMany log,
region hasMany log,

связь по полю (instance_id -> id)
А в запросе добавляйте условие для instance_type и целевую модель.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы