mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
Merge branch '5.1' into 5
This commit is contained in:
commit
7e30e38ae6
@ -1386,7 +1386,7 @@ class DataList extends ViewableData implements SS_List, Filterable, Sortable, Li
|
|||||||
if ($parentData->hasID($parentID)) {
|
if ($parentData->hasID($parentID)) {
|
||||||
$parentData->addEagerLoadedData($relationName, $parentID, $eagerLoadedData);
|
$parentData->addEagerLoadedData($relationName, $parentID, $eagerLoadedData);
|
||||||
$added = true;
|
$added = true;
|
||||||
break;
|
// can't break here, because the parent might be in multiple relation lists
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
throw new LogicException("Invalid parent for eager loading $relationType relation $relationName");
|
throw new LogicException("Invalid parent for eager loading $relationType relation $relationName");
|
||||||
|
@ -968,7 +968,7 @@ class EagerLoadedList extends ViewableData implements Relation, SS_List, Filtera
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the final rows for this list after applying all transformations.
|
* Gets the final rows for this list after applying all transformations.
|
||||||
* Currently only limit is applied lazily, but others could be done this was as well.
|
* Currently only limit and sort are applied lazily, but filter could be done this was as well in the future.
|
||||||
*/
|
*/
|
||||||
private function getFinalisedRows(): array
|
private function getFinalisedRows(): array
|
||||||
{
|
{
|
||||||
|
@ -1254,4 +1254,39 @@ class DataListEagerLoadingTest extends SapphireTest
|
|||||||
$obj = EagerLoadObject::get()->eagerLoad('HasManyEagerLoadObjects')->last();
|
$obj = EagerLoadObject::get()->eagerLoad('HasManyEagerLoadObjects')->last();
|
||||||
$this->assertInstanceOf(EagerLoadedList::class, $obj->HasManyEagerLoadObjects());
|
$this->assertInstanceOf(EagerLoadedList::class, $obj->HasManyEagerLoadObjects());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests that if the same record exists in multiple relations, its data is
|
||||||
|
* eagerloaded without extra unnecessary queries.
|
||||||
|
*/
|
||||||
|
public function testEagerLoadingSharedRelations()
|
||||||
|
{
|
||||||
|
$record1 = EagerLoadObject::create(['Title' => 'My obj1']);
|
||||||
|
$record1->write();
|
||||||
|
$record2 = EagerLoadObject::create(['Title' => 'My obj2']);
|
||||||
|
$record2->write();
|
||||||
|
$manyMany = ManyManyEagerLoadObject::create(['Title' => 'My manymany']);
|
||||||
|
$manyMany->write();
|
||||||
|
$record1->ManyManyEagerLoadObjects()->add($manyMany);
|
||||||
|
$record2->ManyManyEagerLoadObjects()->add($manyMany);
|
||||||
|
$subManyMany = ManyManySubEagerLoadObject::create(['Title' => 'My submanymany']);
|
||||||
|
$subManyMany->write();
|
||||||
|
$manyMany->ManyManySubEagerLoadObjects()->add($subManyMany);
|
||||||
|
|
||||||
|
$eagerLoadQuery = EagerLoadObject::get()
|
||||||
|
->filter(['ID' => [$record1->ID, $record2->ID]])
|
||||||
|
->eagerLoad('ManyManyEagerLoadObjects.ManyManySubEagerLoadObjects');
|
||||||
|
$loop1Count = 0;
|
||||||
|
$loop2Count = 0;
|
||||||
|
foreach ($eagerLoadQuery as $record) {
|
||||||
|
$loop1Count++;
|
||||||
|
$eagerLoaded1 = $record->ManyManyEagerLoadObjects();
|
||||||
|
$this->assertInstanceOf(EagerLoadedList::class, $eagerLoaded1);
|
||||||
|
foreach ($eagerLoaded1 as $manyManyRecord) {
|
||||||
|
$loop2Count++;
|
||||||
|
$eagerLoaded2 = $manyManyRecord->ManyManySubEagerLoadObjects();
|
||||||
|
$this->assertInstanceOf(EagerLoadedList::class, $eagerLoaded2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user