Захват начальной копии объектов Propel в doSelect

#php #select #propel

#php #выберите #propel

Вопрос:

Я использую Propel 1.6 и нуждаюсь в версии всех таблиц в определенной базе данных. У меня есть несколько таблиц, каждая из которых имеет таблицу с возможностью проверки версий, определенную в схеме (поэтому таблица ‘role’ имеет таблицу ‘role_versionable’ в качестве своего аналога для управления версиями). При сохранении записи в «роли» я хотел бы скопировать существующую запись в role_versionable перед выполнением сохранения.

Это само по себе тривиально: я установил базовый класс для всей схемы в пользовательский класс (который расширяет BaseObject), и все мои сгенерированные классы модели строк расширяют этот класс. В моей пользовательской процедуре сохранения я делаю новый выбор, а затем сохраняю его в таблице версий. Однако я должен иметь возможность перехватывать doSelect [One] во всех классах строк, но я не хочу создавать дочерние объекты для каждой таблицы в модели.

Поэтому мне интересно, есть ли способ, которым я могу подключиться к postSelect или вызываться автоматически после каждого doSelect, чтобы получить начальное состояние объекта после его выбора? Это избавит меня от дополнительного выбора, когда я перейду к версии строки.

(Подробно: я делаю это по-своему, поскольку мне нужно добавить дополнительные метаданные в таблицу версий, которые, как я полагаю, не поддерживает archive_behaviour.)

Комментарии:

1. Один из подходов, который я мог бы предпринять, — это создать дочерние классы для каждого из моих одноранговых узлов (система представляет собой приложение БД, поэтому мне пришлось бы делать это программно от имени пользователя, но это вполне достижимо). Это дало бы мне возможность подключаться к каждому doSelect, но tbh это кажется немного неэлегантным. Итак … есть идеи? 🙂

2. Я могу отправить это сообщение в список рассылки Propel. Но не потребуется значительных усилий, чтобы использовать подход, описанный в моем первом комментарии — генерировать дочерние классы. Не самый элегантный из подходов, но обязательно сработает.

Ответ №1:

AFAIK нет способа использовать перехват до или после вызова doSelect . Ваш лучший шанс — переопределить этот метод в вашем собственном классе и добавить перехват самостоятельно. Я, вероятно, напишу свой собственный одноранговый конструктор для этого.

Уильям

Комментарии:

1. А, пользовательский одноранговый конструктор — хорошая идея. Поскольку мое приложение предназначено для создания базы данных, инициируемой пользователем, я думал об использовании поиска и замены регулярных выражений во всех классах строк как части моего пользовательского процесса сборки; однако ваше предложение более изящно! Я сделаю заметку, чтобы попробовать это в будущем.

2. Кстати, спасибо за вашу работу над Propel — очень признателен.