Silverstripe 3:断开许多关系

Silverstripe 3: Unlink many many relationships

有没有办法使用代码解除 SilverStripe 3 中的 many_many 关系?

在某个日期之后,我想取消发布一个页面并取消链接它的所有许多关系。

我该怎么做?

SilverStripe 3 中的许多关系是未版本化的,除非您有非常多的关系,否则在页面未发布时维护关系链接不会对性能产生影响。

或者,您可以在取消发布期间使用 onBeforeUnpublish 挂钩删除关系。

Unlink 基本上调用 $page->Relation()->remove($object);

如果您想删除关系,您可以使用 onBeforeUnpublish() 挂钩,例如:

class Page extends SiteTree
{
    public function onBeforeUnpublish()
    {
        foreach ($this->Relation() as $object) {
            $this->Relation()->remove($object);
        }
    }
}

如果您想自动执行此操作,您可能需要向 PageController::init() 添加一些内容,循环遍历所有需要取消发布的页面,然后取消发布它们(我认为使用 Page::doUnpublish())。

或者,您可以编写 BuildTask 然后 运行 通过 cron 作业。

注意我还没有测试上面的代码,它需要一些调整...