Знает ли Propel, когда объект был удален программно, чтобы дочерние объекты все еще могли показывать своего удаленного родителя?

StackOverflow https://stackoverflow.com/questions/2519297

  •  22-09-2019
  •  | 
  •  

Вопрос

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

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

Например,

У книги есть AuthorID, и если автор, принадлежащий AuthorID, автоматически удаляется, то:

$book->getAuthor();

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top