2012-06-16 2 views
1

Я пытаюсь определить, где лучше всего обновлять другие связанные таблицы при изменении зависимости от внешнего ключа.Как обновить дальнейшие таблицы по добавлению отношения в propel

Чтобы быть точным, я таблица называется 'плоской', а другой называется 'номер', который содержит

flat_id: {Тип: Integer, foreignTable: плоский, foreignReference: идентификатор, требуется: истинно}

Как метод номер :: SetFlatId(), Propel (1,3) и дал мне номер :: SetFlat()

Но когда я добавляю комнату в квартиру, я хочу, чтобы автоматически вносить изменения к некоторым другим связанным таблицам, чтобы сохранить согласованность на более высоком уровне чем определение базы данных. Я думал, что переопределит Flat :: addRoom (Room $ room), чтобы вызвать его родителя, а затем внести следующие изменения.

Но я столкнулся с проблемой, потому что, поскольку требуется столбец «flat_id», всегда будет вызван один из SetFlatId() и setFlat() перед тем, как объект Room будет сохранен.

Но до того, как объект Комнаты сохранен, он не имеет идентификатора, поэтому мой расширенный addRoom не может работать, потому что нет никакой комнаты_ид для идентификации связанных записей в других таблицах.

Это похоже на то, что я не должен вставлять код в Flat :: addRoom(), который зависит от сохраненной комнаты. Но где я могу поместить свой код?

Очевидно, я мог просто потребовать, чтобы его вызывали вручную после создания или изменения объекта комнаты; но поскольку то, что он на самом деле делает, это сохранение своего рода целостности базы данных более высокого уровня, я не желаю этого делать. Я мог бы поместить его в один или оба метода «сохранить»; но логически его нужно запускать только тогда, когда изменяется связь между комнатой и квартирой.

Куда должен идти этот код?

+0

Не типичный случай для [пользовательского поведения] (http://www.propelorm.org/documentation/07-behaviors.html)? – j0k

+0

Ты абсолютно прав. Сразу после того, как я опубликовал его, я понял, что он принадлежит save(), но я не знал об этих крючках. Сделайте это ansewr, и я приму это. –

ответ

Смежные вопросы