Merge pull request #11085 from kinglozzer/11083-unsaved-relationlist-bug

FIX: UnsavedRelationList first/last to return null if list is empty (fixes #11083)
This commit is contained in:
Guy Sartorelli 2023-12-05 09:05:16 +13:00 committed by GitHub
commit 6698e5accd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 23 additions and 4 deletions

View File

@ -239,11 +239,11 @@ class UnsavedRelationList extends ArrayList implements Relation
*/ */
public function first() public function first()
{ {
$item = reset($this->items); $item = reset($this->items) ?: null;
if (is_numeric($item)) { if (is_numeric($item)) {
$item = DataObject::get_by_id($this->dataClass, $item); $item = DataObject::get_by_id($this->dataClass, $item);
} }
if (!empty($this->extraFields[key($this->items)])) { if ($item && !empty($this->extraFields[key($this->items)])) {
$item->update($this->extraFields[key($this->items)]); $item->update($this->extraFields[key($this->items)]);
} }
return $item; return $item;
@ -256,8 +256,11 @@ class UnsavedRelationList extends ArrayList implements Relation
*/ */
public function last() public function last()
{ {
$item = end($this->items); $item = end($this->items) ?: null;
if (!empty($this->extraFields[key($this->items)])) { if (is_numeric($item)) {
$item = DataObject::get_by_id($this->dataClass, $item);
}
if ($item && !empty($this->extraFields[key($this->items)])) {
$item->update($this->extraFields[key($this->items)]); $item->update($this->extraFields[key($this->items)]);
} }
return $item; return $item;

View File

@ -310,4 +310,20 @@ class UnsavedRelationListTest extends SapphireTest
] ]
); );
} }
public function testFirstAndLast()
{
$object = new UnsavedRelationListTest\TestObject();
$children = $object->Children();
$this->assertNull($children->first(), 'Empty UnsavedRelationList should return null for first item.');
$this->assertNull($children->last(), 'Empty UnsavedRelationList should return null for last item.');
$children->add($firstChild = $this->objFromFixture(UnsavedRelationListTest\TestObject::class, 'ObjectA'));
$children->add($this->objFromFixture(UnsavedRelationListTest\TestObject::class, 'ObjectB'));
$children->add($lastChild = $this->objFromFixture(UnsavedRelationListTest\TestObject::class, 'ObjectC'));
$this->assertEquals($firstChild, $children->first(), 'Incorrect first item in UnsavedRelationList.');
$this->assertEquals($lastChild, $children->last(), 'Incorrect last item in UnsavedRelationList.');
}
} }