Created
May 16, 2024 11:09
-
-
Save NightJar/9a7bfc580e7ceefff635e81eb7c482cf to your computer and use it in GitHub Desktop.
Stop doing 1+N queries when using summary fields with relations (e.g. GridFieldDataColumns or GridFieldExportButton)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
use SilverStripe\ORM\DataList; | |
use SilverStripe\ORM\DataObject; | |
use SilverStripe\ORM\Queries\SQLSelect; | |
function alterListToSummaryFields(DataList $list): SQLSelect | |
{ | |
$model = $list->dataClass(); | |
$instance = $model::create(); | |
$schema = DataObject::getSchema(); | |
$summaryFields = $instance->summaryFields(); | |
$dataQuery = $list->dataQuery(); | |
foreach ($summaryFields as $description => $alias) { | |
$references = explode('.', $description); | |
$field = array_pop($references); | |
$fieldModel = $model; | |
if (!empty($references)) { | |
$fieldModel = $dataQuery->applyRelation($references); | |
} | |
$selectedFields[$alias] = $schema->sqlColumnForField( | |
$fieldModel, | |
$field, | |
$dataQuery->applyRelationPrefix($references) | |
); | |
} | |
$sqlQuery = $dataQuery->getFinalisedQuery(); | |
$sqlQuery->setSelect($selectedFields); | |
return $sqlQuery; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment