Skip to content

Commit

Permalink
Merge pull request #10460 from creative-commoners/pulls/5/rescue-mast…
Browse files Browse the repository at this point in the history
…er-dataobject-get-any-one

API Rescue Master Branch PR: Allow dataobject get_one without passing a class
  • Loading branch information
emteknetnz authored Aug 24, 2022
2 parents 4a3b6d9 + f2de391 commit f5d72e9
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 5 deletions.
20 changes: 15 additions & 5 deletions src/ORM/DataObject.php
Original file line number Diff line number Diff line change
Expand Up @@ -3399,24 +3399,34 @@ public static function get(
* $member = DataObject::get_one('Member', [ '"FirstName"' => 'John' ]);
* </code>
*
* @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) {
Expand Down
6 changes: 6 additions & 0 deletions tests/php/ORM/DataObjectTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -436,6 +436,12 @@ public function testGet()
$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()
Expand Down

0 comments on commit f5d72e9

Please sign in to comment.