Знает ли Propel, когда объект был мягко удален, чтобы дочерние объекты могли по-прежнему показывать своего удаленного родителя? - PullRequest
3 голосов
/ 25 марта 2010

Я мягко удаляю объекты в базе данных MySQL и использую Propel ORM. Я получил мягкое удаление, чтобы работать, но ценой потери моих принудительных родительско-дочерних отношений, так как фактические строки не удаляются.

Есть ли какой-нибудь способ для Propel узнать, что запись была мягко удалена при обращении к ней, чтобы исключение с нулевой ссылкой не создавалось? Таким образом, хотя родитель был удален, его дочерний элемент все еще может читать его отношение, но когда обновляет дочерний элемент или создает новый дочерний элемент, удаленный родитель недоступен.

Например,

Книга имеет AuthorId, и если автор, принадлежащий AuthorId, удаляется программным способом, то:

$book->getAuthor();

вернет верного автора (только для просмотра). Однако, если была добавлена ​​новая книга, автор, который был удален программным способом, недоступен для выбора.

Кто-нибудь знает, встроена ли эта функциональность в Propel?

Ответы [ 3 ]

1 голос
/ 15 января 2014

Мягкое удаление - это неработающая абстракция. Вместо этого вы должны использовать архивируемое поведение (см. Почему в блоге Propel: http://propelorm.org/blog/2011/08/29/introducing-archivable-behavior-and-why-soft-delete-is-deprecated.html)

0 голосов
/ 23 декабря 2013

Просто наткнулся на этот вопрос. Похоже, было бы гораздо разумнее не использовать мягкое удаление для описываемой вами функциональности. Я настоятельно рекомендую вам создать поле, чтобы указать, включены ли авторы, то есть булево поле с именем isEnabled.

Затем вы можете использовать сгенерированный метод фильтра для класса AuthorQuery, в данном случае

AuthorQuery::create->filterByisEnabled()
                   ->find();

Если объект все еще будет использоваться в приложении, удалить его нецелесообразно. Функциональность Soft Delete предназначена только для справки или для исправления ошибок.

0 голосов
/ 09 ноября 2010

Я не уверен, почему автору было бы разрешено удалить, но его работы не будут (или, в принципе, почему это возникает как сценарий в вашем проекте), но вы можете создать собственные критерии и выполнить их. Следующий код зависит от версии Propel, которую вы используете (но концепция остается той же):

$c = new Criteria();
$c->getNewCriterion(self::AUTHOR_ID, $parentId);
return self::doSelect($c, $connection);
...