我的数据对象名为属性和属性集
属性集与属性
具有多次关系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';
}
}
在属性集上,但是与推测一样,它不起作用,因为如果添加了新属性,则不会写入集合。
有办法做到这一点吗?
提前谢谢
答案 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中反序列化它并检查差异。
这不是一项有效的任务,但我认为这是实现目标的唯一方法。