<?php namespace SilverStripe\ORM\Tests\DataObjectTest; use SilverStripe\Dev\TestOnly; use SilverStripe\ORM\Connect\Query; use SilverStripe\ORM\DataObject; use SilverStripe\ORM\DB; use SilverStripe\ORM\HasManyList; use SilverStripe\ORM\Hierarchy\Hierarchy; use SilverStripe\ORM\ManyManyList; use SilverStripe\ORM\Queries\SQLUpdate; /** * The purpose of this test class is to test recursive writes and make sure we don't get stuck in an infinite loop. * @property int $WriteCount Number of times this object was written sine the last call of `resetCount` */ class TreeNode extends DataObject implements TestOnly { private static $table_name = 'DataObjectTest_TreeNode'; private static $db = [ 'Title' => 'Varchar', 'WriteCount' => 'Int' ]; private static $has_one = [ 'Parent' => self::class, 'Cycle' => self::class, ]; private static $has_many = [ 'Children' => self::class, ]; public function write($showDebug = false, $forceInsert = false, $forceWrite = false, $writeComponents = false) { // Force the component to fetch its Parent and Cycle relation so we have components to recursively write $this->Parent; $this->Cycle; // Count a write attempts $this->WriteCount++; return parent::write($showDebug, $forceInsert, $forceWrite, $writeComponents); } /** * Reset the WriteCount on all TreeNodes */ public function resetCounts() { $update = new SQLUpdate( sprintf('"%s"', self::baseTable()), ['"WriteCount"' => 0] ); $results = $update->execute(); } }