TL;DR一部のページに関連してバージョン管理された DataObject を作成/保存すると、対応するバージョン テーブルに (1 つではなく) 2 つのエントリが作成されます。
一部の DataObject をバージョン管理しようとしており、バージョン管理された拡張機能を次のように適用しています。
class Testobject extends DataObject {
static $has_one = array(
'Page' => 'Page'
);
static $extensions = array(
"Versioned('Stage', 'Live')",
);
Testobjects は、いくつかのページの GridField で次のように管理されています。
class PageContent extends Page {
public static $has_many = array(
"Testobjects" => "TestObject"
);
public function getCMSFields() {
$fields = parent::getCMSFields();
$config = GridFieldConfig_RelationEditor::create();
$gridField = new GridField(
'Testobjects',
'Testobject',
$this->Testobjects(),
$config);
$fields->addFieldToTab('Root.Main', $gridField);
}
これで、GridField の EditForm に Testobject を追加または保存すると、Testobject_versions テーブルに2 つの新しいエントリが表示されます。比較のために、SiteTree にページを保存すると、対応するバージョン テーブルにエントリが1 つだけ作成されます。
ページにはこれらの DataObject が何千もあるため、この重複によってデータベースがいっぱいになるのではないかと心配しています。これを回避する方法はありますか?
その他の表彰:
新しい Testobject の作成時に、バージョン テーブルの最初のエントリはその PageID フィールドを 0 に設定し、2 番目のエントリは対応するページの実際の PageID を設定します。
$this->Testobjects()
GridField の構造を に置き換えると、バージョン テーブルにエントリが1 つTestobject::get()
だけ表示されます。使用時にonBeforeWriteが2回呼び出されます
$this->Testobjects()
したがって、ページへの関係の設定は、最初の「write()」の後に行われ、次に別の「write()」が呼び出されるようです。しかし、これはコードのどこで発生するのでしょうか?