From f2de39162dc1f197de2fcf8e2c8e2947acdb3754 Mon Sep 17 00:00:00 2001 From: Andrew Aitken-Fincham Date: Mon, 15 Oct 2018 14:27:09 +0100 Subject: [PATCH] API Allow dataobject get_one without passing a class add class validation early in get_one() --- src/ORM/DataObject.php | 20 +++++++++++++++----- tests/php/ORM/DataObjectTest.php | 6 ++++++ 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/ORM/DataObject.php b/src/ORM/DataObject.php index b236b253c..8e3480e90 100644 --- a/src/ORM/DataObject.php +++ b/src/ORM/DataObject.php @@ -3399,24 +3399,34 @@ class DataObject extends ViewableData implements DataObjectInterface, i18nEntity * $member = DataObject::get_one('Member', [ '"FirstName"' => 'John' ]); * * - * @param string $callerClass The class of objects to be returned + * @param string|null $callerClass The class of objects to be returned. Defaults to the class that calls the method + * e.g. MyObject::get_one() will return a MyObject * @param string|array $filter A filter to be inserted into the WHERE clause. * @param boolean $cache Use caching - * @param string $orderby A sort expression to be inserted into the ORDER BY clause. + * @param string $orderBy A sort expression to be inserted into the ORDER BY clause. * * @return DataObject|null The first item matching the query */ - public static function get_one($callerClass, $filter = "", $cache = true, $orderby = "") + public static function get_one($callerClass = null, $filter = "", $cache = true, $orderBy = "") { + if ($callerClass === null) { + $callerClass = static::class; + } + + // Validate class + if ($callerClass === self::class) { + throw new InvalidArgumentException('DataObject::get_one() cannot query non-subclass DataObject directly'); + } + /** @var DataObject $singleton */ $singleton = singleton($callerClass); - $cacheComponents = [$filter, $orderby, $singleton->getUniqueKeyComponents()]; + $cacheComponents = [$filter, $orderBy, $singleton->getUniqueKeyComponents()]; $cacheKey = md5(serialize($cacheComponents)); $item = null; if (!$cache || !isset(self::$_cache_get_one[$callerClass][$cacheKey])) { - $dl = DataObject::get($callerClass)->where($filter)->sort($orderby); + $dl = DataObject::get($callerClass)->where($filter)->sort($orderBy); $item = $dl->first(); if ($cache) { diff --git a/tests/php/ORM/DataObjectTest.php b/tests/php/ORM/DataObjectTest.php index 9ec9e1629..04787f883 100644 --- a/tests/php/ORM/DataObjectTest.php +++ b/tests/php/ORM/DataObjectTest.php @@ -436,6 +436,12 @@ class DataObjectTest extends SapphireTest $this->assertEquals('Bob', $comment->Name); $comment = DataObject::get_one(DataObjectTest\TeamComment::class, '', true, '"Name" DESC'); $this->assertEquals('Phil', $comment->Name); + + // Test get_one() without passing classname + $this->assertEquals( + DataObjectTest\TeamComment::get_one(), + DataObject::get_one(DataObjectTest\TeamComment::class) + ); } public function testGetByIDCallerClass()