Silverstripe 3 - 检测many_many关系的变化

时间:2014-07-15 22:29:43

标签: silverstripe

我的数据对象名为属性属性集

属性集与属性

具有多次关系
private static $many_many = array(
    'Attributes' => 'Attribute'
);

属性我已经得到了这个

private static $belongs_many_many = array(
    'Sets' => 'AttributeSet'
);

您可以直接从集合或属性向集合添加属性。 现在我需要知道何时将新属性添加到集合中,然后再更新其他内容。我用

试了一下
public function onBeforeWrite(){
    parent::onBeforeWrite();

    if( $this->isChanged('Attributes') ){
        $this->Title = 'test';
    }

}

在属性集上,但是与推测一样,它不起作用,因为如果添加了新属性,则不会写入集合。

有办法做到这一点吗?

提前谢谢

2 个答案:

答案 0 :(得分:1)

你不能做这样的事吗?

public function onBeforeWrite(){
    parent::onBeforeWrite();

    foreach($this->Attributes() as $attribute) {
        if($attribute->isChanged()) {
            $this->Title = 'test';
            break;
        }
    }
}

更新:我现在意识到这对于被删除的对象不起作用。也许这是另一种选择。所以在many_many对象上做一个onBeforeDelete,它在" parent(s)"中设置字段。然后保存它。您甚至可以为onbeforeWrite执行此操作...

更新2: 有点不清楚你想要什么。您是否想知道many_many对象是否已更改,无论何时发生这种情况,或者您只是想知道它们是否在当前页面加载期间发生了变化?

isChanged仅在从数据库加载对象时起作用,然后在同一周期内更改某些内容。当前执行周期的其余部分isChanged将返回true。下一个循环,重新加载对象,isChanged返回false。

如果您想知道自上次打开父对象以来是否有更改,则应将其存储在数据库本身或父对象(也在数据库中)中。这很容易,只需用布尔标志更改父对象,然后再次保存。如果您想跟踪需要实现类似@ g4b0建议的更改,或者尝试向对象添加版本控制。但后者可能会迫使你做很多自定义编码。

答案 1 :(得分:1)

您可以在某种程度上序列化类似于json_encode的ManyManyList并在初始阶段将其存储在私有变量中,然后您可以在onBeforeWrite中反序列化它并检查差异。

这不是一项有效的任务,但我认为这是实现目标的唯一方法。